将函数应用于R中的多个时间序列行

时间:2014-02-15 19:16:53

标签: r xts

我有一个包含多个列的时间序列,其中一些列中包含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或函数返回的向量长度是否有问题?

2 个答案:

答案 0 :(得分:2)

根据评论,您实际上并不想将该函数应用于每一行。相反,你想利用R的矢量化特性,即你可以简单地做到这一点

100*diff(my.ts)/my.ts

如果您确实要将函数应用于矩阵的每一行(这是xts对象的行),则可以将applyMARGIN=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)