我有一个包含多个列的时间序列,其中一些列中包含NA
个,例如:
date.a<-seq(as.Date('2014-01-01'),as.Date('2014-02-01'),by = 2)
date.b<-seq(as.Date('2014-01-01'),as.Date('2014-02-15'),by = 3)
df.a <- data.frame(time=date.a, A=sin((1:16)*pi/8))
df.b <- data.frame(time=date.b, B=cos((1:16)*pi/8))
my.ts <- merge(xts(df.a$A,df.a$time),xts(df.b$B,df.b$time))
我想将函数应用于每一行,特别是:
prices2percreturns <- function(x){100*diff(x)/x}
我认为sapply
可以做到这一点,但
sapply(my.ts, prices2percreturns)
给出Error in array(r, dim = d, dimnames = if (!(is.null(n1 <- names(x[[1L]])) & :
length of 'dimnames' [1] not equal to array extent
。我怀疑这是由于合并时的NA
,但也许我只是做错了。我是否需要删除NA
s或函数返回的向量长度是否有问题?
答案 0 :(得分:2)
根据评论,您实际上并不想将该函数应用于每一行。相反,你想利用R的矢量化特性,即你可以简单地做到这一点
100*diff(my.ts)/my.ts
如果您确实要将函数应用于矩阵的每一行(这是xts对象的行),则可以将apply
与MARGIN=1
一起使用。即apply(my.ts, 1, myFUN)
。
sapply(my.ts, myFUN)
的工作方式与apply(my.ts, 2, myFUN)
相同 - 将函数应用于每列。
答案 1 :(得分:1)
您的diff(x)
将比x
短1。您的退货也将基于结果。您希望根据起始价格而非最终价格返回。在这里,我更改函数以反映该函数并按列应用函数。
prices2percreturns <- function(x){100*diff(x)/x[-length(x)]}
prcRets = apply(my.ts, 2, prices2percreturns)