【发布时间】:2017-04-20 15:04:54
【问题描述】:
全部:
当我尝试使用for 循环创建 5 个数据帧并将这五个数据帧分配给一个列表时,问题就来了。请看一个例子:
library(data.table)
set.seed(123)
df <- as.data.table(list(rnorm(10,1,1), rnorm(10,1,1)))
list <- list()
for(i in 2011:2015){
list[[paste0("A_",i)]] <- df[, year := as.numeric(i)]
}
所以,正如我所料,year 变量的值应该与每个元素中的i 相同。例如,list[1] 中 year 的值应该是 2011。但是,上面的代码在所有元素中为 year 返回 2015:
> list[1]
$A_2011
V1 V2 year
1: 0.4395244 2.2240818 2015
2: 0.7698225 1.3598138 2015
3: 2.5587083 1.4007715 2015
4: 1.0705084 1.1106827 2015
5: 1.1292877 0.4441589 2015
6: 2.7150650 2.7869131 2015
7: 1.4609162 1.4978505 2015
8: -0.2650612 -0.9666172 2015
9: 0.3131471 1.7013559 2015
10: 0.5543380 0.5272086 2015
我无法弄清楚我的代码有什么问题。如果有人能在这里指出问题,我将不胜感激。我想看看使用lapply 左右的任何其他解决方案,如果有的话。非常感谢!
【问题讨论】:
-
快速修复:在您的循环中添加
list[[paste0("A_",i)]]$year <- i。 -
一般来说,把它放在一张桌子上会少很多痛苦,比如
yrs = 2011:2015; res <- df[rep(1:.N, length(yrs))][, year := rep(yrs, each = nrow(df))][]或df[, rbindlist(Map(cbind, .(.SD), year = yrs))] -
@Majo 修复有效!但是,我真的很想知道为什么我的代码不能按预期工作。我认为那里的逻辑是正确的。
-
@Frank 谢谢!多么美妙的解决方案!
标签: r for-loop data.table