使用R分配循环中的值



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

最新更新