R data.table处理混淆变量名称的一行语句

问题描述:

假设dt是一个data.table对象,其列ABCR data.table处理混淆变量名称的一行语句

我想在列循环过滤掉一些行,然后在该列应用功能:

for(col in c("A", "B", "C")){ 
    dt[col %in% some_filter[[col], col := some_function(col), with=FALSE] 
} 

哪里some_filter是包含一些有效值list,例如some_filter[["A"]] = c("just", "an", "example")

但是通过参考col这4个位置,data.table似乎弄乱了命名空间并且失败了。

通过临时变量有一个解决方法,但如何在一行中执行此任务?

一个不工作的代码是:

library(data.table) 
library(dplyr) 
dt <- data.table(A=1:10, B=11:20, C=21:30) 
f <- list() 
f[["A"]] <- 3:5 
f[["B"]] <- 14:18 
f[["C"]] <- 28:29 
for(col in colnames(dt)){ 
    dt[col %in% f[[col]], col := col * 2, with=F] # Double up some rows 
} 
+1

你能预期的输出增加的问题。也许你想要的是'get(col)'在data.table中调用 – dww

+0

是的,请用实况(即示例函数)填写'f'并添加预期的输出。 – lukeA

我们可以用get从含有其名称的字符变量访问列。 ()周围的:=的LHS还优选使用with = F

for(col in colnames(dt)){ 
    dt[get(col) %in% f[[col]], (col) := get(col) * 2L] # Double up some rows 
} 

#  A B C 
# 1: 1 11 21 
# 2: 2 12 22 
# 3: 6 13 23 
# 4: 8 28 24 
# 5: 10 30 25 
# 6: 6 32 26 
# 7: 7 34 27 
# 8: 8 36 56 
# 9: 9 19 58 
# 10: 10 20 30 

另一种选择是使用set

for(nm1 in names(dt)) { 
    i1 <- which(dt[[nm1]] %in% f[[nm1]]) 
    set(dt, i= i1, j = nm1, value = dt[[nm1]][i1]*2L) 
} 
dt 
#  A B C 
# 1: 1 11 21 
# 2: 2 12 22 
# 3: 6 13 23 
# 4: 8 28 24 
# 5: 10 30 25 
# 6: 6 32 26 
# 7: 7 34 27 
# 8: 8 36 56 
# 9: 9 19 58 
#10: 10 20 30