我有一个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
显示打印DT
。 as.factor
- 转换看起来不对,当然不起作用。
但是怎么做呢?
答案 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
而不是多个全局对象