Таблица подмножеств по логическому столбцу
У меня есть data.table
с логическим столбцом. Почему имя логического столбца нельзя использовать напрямую для аргумента i
? См. Пример.
dt <- data.table(x = c(T, T, F, T), y = 1:4)
# Works
dt[dt$x]
dt[!dt$x]
# Works
dt[x == T]
dt[x == F]
# Does not work
dt[x]
dt[!x]
Ответы
Ответ 1
От ?data.table
Дополнительно: Когда я - это одно имя переменной, оно не считается выражение имен столбцов и вместо этого оценивается в области вызова.
Итак, dt[x]
попытается оценить x
в области вызова (в данном случае глобальную среду)
Вы можете обойти это, используя (
или {
или force
dt[(x)]
dt[{x}]
dt[force(x)]
Ответ 2
x
не определяется в глобальной среде. Если вы попробуете это,
> with(dt, dt[x])
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
Это сработает. Или это:
> attach(dt)
> dt[!x]
x y
1: FALSE 3
EDIT:
согласно документации параметр j
принимает имя столбца, фактически:
> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1] TRUE TRUE FALSE TRUE
тогда параметр i
принимает либо числовое, либо логическое выражение (например, сам x), однако кажется, что (data.table) не может видеть x
как логическое без этого:
> dt[i = x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[i = as.logical(x)]
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
Ответ 3
Это также должно работать и, возможно, более естественно:
setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]