遍历对象列表并通过 data.table 中的引用进行更改

Loop through list of objects and change by reference in data.table

我有一个 data.table 对象的列表,这些对象都具有相似的名称和一些 属性 我想通过遍历此列表来更改所有这些对象。让我们考虑一下:

set.seed(999)
GenName_ksio3k_F1 <-data.table(Risknr = runif(10,1000,9999), Code=LETTERS[sample.int(10)], val=rnorm(10));GenName_ksio3k_F1
GenName_kf0bner_F6 <-data.table(Risknr = runif(10,1000,9999), Code=LETTERS[sample.int(10)], val=rnorm(10));GenName_kf0bner_F6
GenName_sjkw_F2 <-data.table(Risknr = runif(10,1000,9999), Code=LETTERS[sample.int(10)], val=rnorm(10));GenName_sjkw_F2

因此,正如这个命名所暗示的那样,这些对象具有相似的名称,我可以通过正则表达式在列表中方便地捕获这些名称:

list =  grep("^(GenName_).*(F[0-9])$", ls(), perl=TRUE, value=TRUE);list

现在,我想做的是将所有这些表中的列 Risknr 更改为因子变量。我试过这个:

    for(DT in list){
      print(str(eval(parse(text = DT)))) # as a test
      eval(parse(text = DT))$Risikonr <- as.factor(eval(parse(text = DT$Risikonr)
}

访问变量似乎有效,因为每个 DT 显示打印 stras.factor-转换看起来不对,当然是行不通的。 但如何做到这一点?

我们可以使用get获取值,如果需要更新使用assign

for(DT in list){
    assign(DT, value = get(DT)[, Risknr := factor(Risknr)])

}

str(GenName_sjkw_F2)
#Classes ‘data.table’ and 'data.frame':  10 obs. of  3 variables:
# $ Risknr: Factor w/ 10 levels "1899.01318506384",..: 4 9 7 5 1 3 2 10 8 6
# $ Code  : chr  "G" "B" "A" "E" ...
# $ val   : num  -0.1167 -0.645 1.7444 0.3661 -0.0668 ...
# - attr(*, ".internal.selfref")=<externalptr> 
str(GenName_kf0bner_F6)
#Classes ‘data.table’ and 'data.frame':  10 obs. of  3 variables:
# $ Risknr: Factor w/ 10 levels "1497.60077643953",..: 2 10 9 7 6 5 8 4 3 1
# $ Code  : chr  "H" "F" "B" "G" ...
# $ val   : num  2.383 0.601 0.179 1.081 -0.247 ...
# - attr(*, ".internal.selfref")=<externalptr> 

但是,最好将数据集放在一个 list 中而不是多个全局对象中