2013-04-24 4 views
27

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

ответ

27

От ?data.table

Дополнительно: Когда i является одной переменной имя, оно не считается выражение имен столбцов и вместо того, чтобы оценивать в вызове сферы.

Так dt[x] будет пытаться оценить x в вызывающей области видимости (в данном случае глобальной окружающей среды)

Вы можете обойти эту проблему с помощью ( или { или force

dt[(x)] 
dt[{x}] 
dt[force(x)] 
+0

(+1) интересное использование функции 'force'. Как работает «сила» в этом случае? Как это изменяет среду/область? – Nishanth

+0

Немного больше информации о _why_ [здесь] (http://r.789695.n4.nabble.com/Indexing-by-a-logical-column-tp4665153p4665142.html). –

+0

'force' в основном останавливает его, будучи проиндексированным как единственная переменная (это делается с некоторыми вычислениями в вызове внутри' .data.table') 'force', а затем заставляет оценивать' x', который вернет 'x' в пределах области данных. – mnel

4

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 
+0

Не уверен, что это проблема, 'x' не определена в глобальной среде, но работает' dt [x == T] '. – djhurio

+0

Вы правы, однако эта ошибка «Ошибка в eval (expr, envir, enc): объект« x »не найден» указывает на это. Итак, вы, вероятно, выделили возможную ошибку – Michele

+0

@djhurio. В '' '' '' '' '' '' '' '' '' '.data.table' сказано, что выражение выражается в пределах кадра data.table (т.е. видит имена столбцов, как если бы они были переменными) '. Однако в параметре 'i' кажется, что требуется явное выражение типа' == 'или' as.logical'. – Michele

2

Это должно также работают и, возможно, более естественны:

setkey(dt, x) 
dt[J(TRUE)] 
dt[J(FALSE)]