2013-04-24 15 views
27

Ich habe eine data.table mit einer logischen Spalte. Warum kann der Name der logischen Spalte nicht direkt für das Argument i verwendet werden? Siehe das Beispiel.Subset data.table durch logische Spalte

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] 

Antwort

27

Von ?data.table

Advanced: Wenn i ein einzelner Variablenname ist, ist es nicht ein Ausdruck der Spaltennamen in Betracht gezogen und in Aufruf Umfang statt ausgewertet wird.

So wird dt[x] versuchen x in dem anrufenden Rahmen zu bewerten (in diesem Fall die globale Umwelt)

Sie um dies unter Verwendung ( oder { oder force bekommen

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

(+1) interessante Verwendung der 'force' Funktion. Wie funktioniert "Force" in diesem Fall? Wie verändert es die Umgebung? – Nishanth

+0

Eine weitere Informationen über _why_ Bit [hier] (http://r.789695.n4.nabble.com/Indexing-by-a-logical-column-tp4665153p4665142.html). –

+0

'force' im Grunde nicht mehr als eine einzige Variable interpretiert werden wird (dies wird mit einigem Computing auf den Anruf innerhalb' [.data.table' getan) 'force' dann zwingt die Auswertung von 'X', die 'X' zurück innerhalb des data.table-Bereichs. – mnel

4

x ist nicht im globalen Umfeld definiert. Wenn Sie dies versuchen,

> with(dt, dt[x]) 
     x y 
1: TRUE 1 
2: TRUE 2 
3: TRUE 4 

Es würde funktionieren. Oder diese:

> attach(dt) 
> dt[!x] 
     x y 
1: FALSE 3 

EDIT:

entsprechend die Dokumentation der j Parameterspalte Namen nehmen in der Tat:

> dt[x] 
Error in eval(expr, envir, enclos) : object 'x' not found 
> dt[j = x] 
[1] TRUE TRUE FALSE TRUE 

Dann werden die i Parameter nehmen entweder numerischen oder logischen Ausdruck (wie x selbst sollte sein), aber es scheint, es (data.table) kann x als logisch, ohne dass dies nicht sehen:

> 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

Nicht sicher, dass dies ein Problem ist, 'x' ist nicht in der globalen Umgebung definiert, aber' dt [x == T] 'funktioniert. – djhurio

+0

Sie haben Recht, aber dieser Fehler 'Fehler in eval (expr, envir, enclos): Objekt' x 'nicht gefunden' zeigt das an. Also, markiert Sie wahrscheinlich einen möglichen Fehler – Michele

+0

@djhurio In beiden 'I' und 'J' Teil der Dokumentation von' [.data.table' es gesagt wird die 'Ausdruck im Rahmen des data.table ausgewertet wird (dh es sieht Spaltennamen als wären sie Variablen) '. In dem Parameter 'i' scheint jedoch ein expliziter Ausdruck wie '==' oder 'as.logical' erforderlich zu sein. – Michele

2

Dies sollte auch arbeiten und ist wohl natürlichere:

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