2015-07-07 5 views
1

Привет, У меня есть следующий код.Как передать несбалансированные аргументы в mapply

Он рассчитывает процентную разницу между двумя периодами. В течение первого периода функция возвращает NA, поскольку изменений нет.

Я хочу заменить следующий код на mapply и передать два аргумента fn.pc.

ts <- c(12, 14, 15, 17, 12, 8, 13, 16, 20) 
fn.pc <- function(i) { 
if (i == 1) NA else (ts[i] - ts[i-1])/ts[i-1] 
} 
sapply(seq_along(tsVector), fn.pc) 

Например, функция подписи выше, будут заменены:

fn.pc <- function(i, ts) {... 

И тогда эта функция будет вызвана mapply использовать что-то вроде следующего:

mapply(fn.pc, seq_along(ts.vector), ts.vector) 

Но я не может заставить эту идею работать. Я думаю, это связано с тем, что длины двух аргументов различны.

Я как-то могу это работать. Надеюсь, это понятно. Немного сложно объяснить.

+0

почему вы хотите достичь? вам не нужно приклеивать туда ... sapply достаточно. –

+0

sapply() уверен, что работает с приведенным выше примером. Но как насчет того, когда у меня много разных временных рядов. ts1 <- (1,4,5); ts2 <- (42, 44, 50) Я хотел бы использовать одно и то же определение функции для множества разных входных аргументов. – markthekoala

+0

Я обновил свой ответ. –

ответ

1

Предположим, у вас есть список векторных lst. Вы можете продолжить так:

lapply(lst, function(x) sapply(seq_along(x), function(u) diff(x,u))) 

diff Просто используйте разницу:

x = c(12,34,23,11,34,45,12,11) 

> diff(x,2) 
[1] 11 -23 11 34 -22 -34 
> diff(x,3) 
[1] -1 0 22 1 -23 
> diff(x,4) 
[1] 22 11 -11 0 
> diff(x,5) 
[1] 33 -22 -12 
+0

Thats хорошо. Благодаря! Вы правы, я, вероятно, мог это сделать ... но я хочу, чтобы эта концепция работала с mapply() Она будет полезна для более сложных вещей, чем просто вычисление процентов. – markthekoala

+0

Я обновлю свой ответ –

+0

Большое спасибо. Пересмотрит. Поздно здесь, в Новой Зеландии. – markthekoala