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

将函数应用于R中时间序列的多行,r,xts,R,Xts,我有一个包含多个列的时间序列,其中一些列包含NAs,例如: 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

我有一个包含多个列的时间序列,其中一些列包含
NA
s,例如:

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))
给出数组中的
错误(r,dim=d,dimnames=if(!(is.null)(n1你的
diff(x)
将比你的
x
短1。你的回报将基于结果。你希望回报基于起始价格而不是最终价格。这里我更改函数以反映这一点,并应用每列的函数

prices2percreturns <- function(x){100*diff(x)/x[-length(x)]}
prcRets = apply(my.ts, 2, prices2percreturns)
prices2percreturns您的
diff(x)
将比您的
x
短1。您的返回将基于结果。您希望返回基于起始价格而不是结束价格。这里我更改函数以反映这一点,并应用每列函数

prices2percreturns <- function(x){100*diff(x)/x[-length(x)]}
prcRets = apply(my.ts, 2, prices2percreturns)
prices2percreturns您的
diff(x)
将比您的
x
短1。您的返回将基于结果。您希望返回基于起始价格而不是结束价格。这里我更改函数以反映这一点,并应用每列函数

prices2percreturns <- function(x){100*diff(x)/x[-length(x)]}
prcRets = apply(my.ts, 2, prices2percreturns)
prices2percreturns您的
diff(x)
将比您的
x
短1。您的返回将基于结果。您希望返回基于起始价格而不是结束价格。这里我更改函数以反映这一点,并应用每列函数

prices2percreturns <- function(x){100*diff(x)/x[-length(x)]}
prcRets = apply(my.ts, 2, prices2percreturns)

prices2percreturns根据注释,您实际上不希望将函数应用于每一行。相反,您希望利用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)
在这种情况下——对每一列应用一个函数。

根据注释,您实际上并不想对每一行应用该函数。相反,您希望利用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)
在这种情况下——对每一列应用一个函数。

根据注释,您实际上并不想对每一行应用该函数。相反,您希望利用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)
在这种情况下——对每一列应用一个函数。

根据注释,您实际上并不想对每一行应用该函数。相反,您希望利用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)
在这种情况下——对每一列应用一个函数。

您只是想这样做:
100*diff(my.ts)/my.ts
?在一行上调用
diff
是没有意义的。另外,
sapply
将把函数应用于每一列。
apply(my.ts,1,FUN)< /代码>将对每一行应用一个函数,但可能不是你想要的。是的。考虑把它作为一个答案。考虑看<代码> TTR::ROC < /代码>和<代码> QuoDimd::Delt < /Cord>你只是想这样做:<代码> 100 *DIFF(M.TS)/my.ts
?在一行上调用
diff
是没有意义的。另外,
sapply
将把函数应用于每一列。
apply(my.ts,1,FUN)< /代码>将对每一行应用一个函数,但可能不是你想要的。是的。考虑把它作为一个答案。考虑看<代码> TTR::ROC < /代码>和<代码> QuoDimd::Delt < /Cord>你只是想这样做:<代码> 100 *DIFF(M.TS)/my.ts
?在一行上调用
diff
是没有意义的。另外,
sapply
将把函数应用于每一列。
apply(my.ts,1,FUN)< /代码>将对每一行应用一个函数,但可能不是你想要的。是的。考虑把它作为一个答案。考虑看<代码> TTR::ROC < /代码>和<代码> QuoDimd::Delt < /Cord>你只是想这样做:<代码> 100 *DIFF(M.TS)/my.ts
?在一行上调用
diff
是没有意义的。另外,
sapply
将把函数应用于每一列。
apply(my.ts,1,FUN)< /代码>将对每一行应用一个函数,但可能不是您想要的。是的。考虑看<代码> TTR::ROC < /COD>和<代码> QuoMod::Delt < /Cord>实际上将被发送:代码> DIF.xTs<代码>,它将返回与输入相同数量的行的<代码> XTS<代码>,填充第一行。使用
NA
(默认情况下)实际上将调度
diff.xts
,它将返回与输入行数相同的
xts
,并在第一行中填充
NA
(默认情况下)实际上,
diff.xts
将被调度,它将返回一个与输入行数相同的
xts
,在第一行中填充
NA
(默认情况下)实际上,
diff.xts
将被调度,它将返回一个与输入行数相同的
xts
,在第一行中填充
NA
(默认情况下)。我认为您建议的解决方案是基于期间结束值的返回,而不是基于