我有一个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
答案 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可以显着改善代码执行。我不知道为什么,但这是事实。