首页 > 解决方案 > 当列名在别处预定义时,R 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

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

所需的输出应如下所示:

DT[x==1,]
   x y
1: 1 0
2: 1 1

但在输入中x替换为。column_name

请注意,此问题与Data.table R 中的 Select subset of columns相似但不完全相同,并且那里的解决方案(使用 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)

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

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

标签: rdata.tablesubset

解决方案


我可以想象这对你来说非常令人沮丧。我为您在发布之前尝试的事情数量鼓掌。这是一种方法:

DT[get(column_name) == 1,]
   x y
1: 1 0
2: 1 1

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

DT[,get(..column_name)]
[1] 1 1 0 0

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

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

推荐阅读