循环遍历对象列表并通过data.table

时间:2018-01-23 10:14:58

标签: r data.table eval

我有一个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)
}

访问该变量似乎有效,因为为每个str显示打印DTas.factor - 转换看起来不对,当然不起作用。 但是怎么做呢?

1 个答案:

答案 0 :(得分:2)

我们可以使用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而不是多个全局对象