我得到了数据表,其中第(i + 1)列取决于前一个,并且需要递归计算。数据表的标题由一个从0开始的序列组成。
0 1 2 3
1: 1 NA NA NA
2: 2 NA NA NA
3: 3 NA NA NA
按索引访问列,例如dt[,..2]
使代码恕我直言最具可读性。但是,在尝试分配时,显然不能使用此方法:
library(data.table)
dt <- data.table("0"=c(1,2,3),"1"=c(NA,NA,NA),"2"=c(NA,NA,NA),"3"=c(NA,NA,NA))
x <- c(0.01, 0.02, 0.015)
for (u in 1:3){
v<- u+1
dt[,..v] <- dt[,..u]*(1+x[u])
}
这会产生以下错误:
Error in `[<-.data.table`(`*tmp*`, , ..v, value = list(`0` = c(1.01, 2.02, : object '..v' not found
更新:感谢@IceCreamToucan的回答。但是,我刚刚发布了一个简单的示例来说明我的一般性问题。由于实际代码的复杂性较高,因此我可能不得不坚持使用for循环。因此,我寻求一种解决方案,以递归方式访问和分配列。
答案 0 :(得分:2)
您可以使用lapply
和cumprod
进行此操作。我重命名了变量,因为我不确定如何处理数字列名称。另请参阅有关outer
和cumprod
选项的注释。
setnames(dt, names(dt), paste0('v', names(dt)))
dt[, names(dt)[-1] := lapply(cumprod(1 + x), '*', v0)][]
# v0 v1 v2 v3
# 1: 1 1.01 1.0302 1.045653
# 2: 2 2.02 2.0604 2.091306
# 3: 3 3.03 3.0906 3.136959
您也可以这样做
for (u in 0:2){
v <- u+1
dt[, as.character(v) := get(as.character(u))*(1 + x[u + 1])]
}
dt[]
# 0 1 2 3
# 1: 1 1.01 1.0302 1.045653
# 2: 2 2.02 2.0604 2.091306
# 3: 3 3.03 3.0906 3.136959