当列名在其他地方预定义时,R data.table 会遇到条件子集问题

Ing*_*ifs 4 r subset data.table

假设我有一个数据表

library(data.table)
DT <- data.table(x=c(1,1,0,0),y=c(0,1,2,3))
column_name <- "x"

   x y
1: 1 0
2: 1 1
3: 0 2
4: 0 3
Run Code Online (Sandbox Code Playgroud)

我想访问 x = 1 的所有行,但使用 column_name。

所需的输出应如下所示:

DT[x==1,]
   x y
1: 1 0
2: 1 1
Run Code Online (Sandbox Code Playgroud)

但在输入中x被替换为。column_name

请注意,此问题与Select subset of columns in data.table R类似但不完全相同,并且那里的解决方案(使用 with=FALSE)在这里不起作用。

这是我尝试过的所有事情。它们都不起作用。

DT[column_name ==1,]
DT[.column_name ==1,]
DT[.(column_name) ==1,]
DT[..column_name ==1,]
DT[."column_name" ==1,]
DT[,column_name ==1,]
DT[,column_name ==1,with=TRUE]
DT[,column_name ==1,with=FALSE]
DT[,.column_name ==1,with=TRUE]
DT[,.column_name ==1,with=FALSE]
DT[,..column_name ==1,with=TRUE]
DT[,..column_name ==1,with=FALSE]
DT[,."column_name" ==1,with=TRUE]
DT[,.column_name ==1,with=FALSE]
DT[column_name ==1,with=TRUE]
DT[column_name ==1,with=FALSE]
DT[[column_name==1,]]
subset(DT,column_name==1)
Run Code Online (Sandbox Code Playgroud)

我也options(datatable.WhenJisSymbolThenCallingScope=TRUE)启用了

显然我缺少某种词汇技巧。我花了几个小时浏览小插图和SO问题,但无济于事。

Ian*_*ell 5

我可以想象这对你来说非常令人沮丧。我对你在发帖前尝试过的很多事情表示赞赏。这是一种方法:

DT[get(column_name) == 1,]
   x y
1: 1 0
2: 1 1
Run Code Online (Sandbox Code Playgroud)

如果需要使用column_namein J,可以使用get(..column_name)

DT[,get(..column_name)]
[1] 1 1 0 0
Run Code Online (Sandbox Code Playgroud)

指示..在父环境中进行评估。

I在or中使用字符串的另一种方法J是 with eval(as.name(column_name))

DT[eval(as.name(column_name)) == 1]
   x y
1: 1 0
2: 1 1

DT[,eval(as.name(column_name))]
[1] 1 1 0 0
Run Code Online (Sandbox Code Playgroud)