Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table处理混淆变量名的单行语句_R_Data.table - Fatal编程技术网

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

R data.table处理混淆变量名的单行语句,r,data.table,R,Data.table,假设dt是一个data.table对象,包含a、B和C 我希望在列上循环以筛选出一些行,然后在该列上应用函数: for(col in c("A", "B", "C")){ dt[col %in% some_filter[[col], col := some_function(col), with=FALSE] } 其中some_filter是包含一些有效值的列表,例如some_filter[[“a”]=c(“just”、“an”、“example”)等 然而,通过在这4个位置中引用col,

假设
dt
是一个
data.table
对象,包含
a
B
C

我希望在列上循环以筛选出一些行,然后在该列上应用函数:

for(col in c("A", "B", "C")){
  dt[col %in% some_filter[[col], col := some_function(col), with=FALSE]
}
其中
some_filter
是包含一些有效值的
列表,例如
some_filter[[“a”]=c(“just”、“an”、“example”)

然而,通过在这4个位置中引用
col
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
}
库(data.table)
图书馆(dplyr)

dt我们可以使用
get
从包含列名称的字符变量访问列
()
关于
的左侧:=
也比使用
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

我们可以使用
get
从包含列名称的字符变量访问列
()
关于
的左侧:=
也比使用
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
for(名称中的nm1(dt)){

i1另一个选项是使用
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
for(名称中的nm1(dt)){

i1您是否可以将预期输出添加到问题中。可能您需要的是数据表callYes中的
get(col)
,请使用live(即示例函数)填充
f
,并添加预期输出。您是否可以将预期输出添加到问题中。可能您需要的是
get(col)
在data.table callYes中,请用live(即示例函数)填写
f
,并添加预期输出。