Подтвердить что ты не робот

Таблица подмножеств по логическому столбцу

У меня есть 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]
4b9b3361

Ответ 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)]