二元运算符的非数字参数 - xts对象

时间:2017-12-14 06:55:57

标签: r

我有一个xts对象dollarReturn。我试图将前一天的回报低于特定阈值X的列CL的所有值加起来。

我收到错误:

  

+ .default(sum,value)出错:     二元运算符的非数字参数

我的循环:

for(n in 1:nrow(dollarReturn)){
  X = -2000
  value = ifelse(dollarReturn$CL[n] < X,dollarReturn$CL[n+1],0)
  sum = sum + value
  print(n)
  return(sum)
}

datasample:

structure(c(-2439.99999999999, -880.000000000002, 779.999999999992, 
590.000000000018, -70.0000000000061, -189.999999999997), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class = c("xts", 
"zoo"), index = structure(c(1420416000, 1420502400, 1420588800, 
1420675200, 1420761600, 1421020800), tzone = "UTC", tclass = "Date"), .Dim = c(6L, 
1L), .Dimnames = list(NULL, "CL"))

2015-01-05 -2440
2015-01-06  -880
2015-01-07   780
2015-01-08   590
2015-01-09   -70
2015-01-12  -190

1 个答案:

答案 0 :(得分:1)

您不能将标准函数sum用作变量。

试试这个:

summ = 0
for(n in 1:nrow(dollarReturn)){
  X = -2000
  value = ifelse(dollarReturn$CL[n] < X,dollarReturn$CL[n+1],0)
  summ = summ + value
  print(n)
}
print(summ).

此外,最好使用ifelse(dollarReturn$CL[[n]] < X,dollarReturn$CL[[n+1]],0)代替ifelse(dollarReturn$CL[n] < X,dollarReturn$CL[n+1],0)

所以,你应该强调你的操作。下面的代码是尝试改进您当前的代码。

boolArr <- as.numeric(dollarReturn$CL < X);
summ2 <- sum(dollarReturn$CL[2:nrow(dollarReturn)] * boolArr[1:(nrow(dollarReturn)-1)]);
print(summ2)

但是我自己的经验,使用data.table而不是xts可以显着改善代码执行。我不知道为什么,但这是事实。