R data.table处理混淆变量名称的一行语句
问题描述:
假设dt
是一个data.table
对象,其列A
,B
和C
。R 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
}
答
我们可以用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
你能预期的输出增加的问题。也许你想要的是'get(col)'在data.table中调用 – dww
是的,请用实况(即示例函数)填写'f'并添加预期的输出。 – lukeA