all:
当我尝试使用for
循环创建5个数据范围并将这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年。但是,以上代码在所有元素中返回2015年的year
:
> 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
左右的其他解决方案(如果有(查看任何解决方案。非常感谢!
for(i in 2011:2015){ list[[paste0("A_",i)]] <- df[, year := as.numeric(i)] }
我很感激是否有人可以在这里指出问题。
<-
将指针指向相同的数据。表, df
,而不是制作副本。将其包装在copy()
中应该解决。但是,使用一张大桌子很清洁:
yrs = 2011:2015
res <- df[, rbindlist(Map(cbind, .(.SD), year = yrs))]
这有几个优点:
- 数据列表。Tables陷入指示器的奇怪问题。
- 一个大数据。表允许一个人使用
by=
对迭代进行迭代,这可能更有效。
这有效:使用dplyr附加新列,而不是以上:
setNames(lapply(2011:2015, function(i){
as.data.table(list(rnorm(10,1,1), rnorm(10,1,1))) %>%
mutate(year = i)
}), sprintf("A_%s", 2011:2015))
编辑种子处理:
setNames(lapply(2011:2015, function(i){
set.seed(123)
as.data.table(list(rnorm(10,1,1), rnorm(10,1,1))) %>%
mutate(year = i)
}), sprintf("A_%s", 2011:2015))
输出:
List of 5
$ A_2011:'data.frame': 10 obs. of 3 variables:
..$ V1 : num [1:10] 0.44 0.77 2.56 1.07 1.13 ...
..$ V2 : num [1:10] 2.224 1.36 1.401 1.111 0.444 ...
..$ year: int [1:10] 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011
$ A_2012:'data.frame': 10 obs. of 3 variables:
..$ V1 : num [1:10] 0.44 0.77 2.56 1.07 1.13 ...
..$ V2 : num [1:10] 2.224 1.36 1.401 1.111 0.444 ...
..$ year: int [1:10] 2012 2012 2012 2012 2012 2012 2012 2012 2012 2012
$ A_2013:'data.frame': 10 obs. of 3 variables:
..$ V1 : num [1:10] 0.44 0.77 2.56 1.07 1.13 ...
..$ V2 : num [1:10] 2.224 1.36 1.401 1.111 0.444 ...
..$ year: int [1:10] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013
$ A_2014:'data.frame': 10 obs. of 3 variables:
..$ V1 : num [1:10] 0.44 0.77 2.56 1.07 1.13 ...
..$ V2 : num [1:10] 2.224 1.36 1.401 1.111 0.444 ...
..$ year: int [1:10] 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014
$ A_2015:'data.frame': 10 obs. of 3 variables:
..$ V1 : num [1:10] 0.44 0.77 2.56 1.07 1.13 ...
..$ V2 : num [1:10] 2.224 1.36 1.401 1.111 0.444 ...
..$ year: int [1:10] 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015