R data.table борется с условным подмножеством, когда имя столбца предопределено в другом месте - PullRequest
1 голос
/ 09 июля 2020

Допустим, у меня есть таблица данных

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, но используя имя_столбца.

Желаемый результат должен вести себя следующим образом :

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

, но с заменой x на column_name во входных данных.

Обратите внимание, что эта проблема похожа, но не совсем такая же, как Select подмножество столбцов в 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)

У меня также есть options(datatable.WhenJisSymbolThenCallingScope=TRUE) включено

Очевидно, мне не хватает какого-то лексического трюка. Я потратил несколько часов, просматривая виньетки и ТАК вопросы, но безрезультатно.

Ответы [ 2 ]

4 голосов
/ 09 июля 2020

Я могу представить, что это вас очень расстраивало. Я аплодирую тому количеству вещей, которые вы пробовали перед публикацией. Вот один из подходов:

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

Если вам нужно использовать column_name в J, вы можете использовать get(..column_name):

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

.. указывает, что выполняется оценка в родительской среде.

Другой подход для использования строки в I или J - с 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
1 голос
/ 09 июля 2020

Вы можете подгруппировать столбец по имени, а затем выбрать строки.

library(data.table)
DT[DT[[column_name]] == 1]

#   x y
#1: 1 0
#2: 1 1
...