2013-04-24 14 views
27

Ho un data.table con una colonna logica. Perché il nome della colonna logica non può essere utilizzato direttamente per l'argomento i? Guarda l'esempio.Sottoinsieme data.table tramite colonna logica

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] 

risposta

27

Da ?data.table

avanzata: Quando i è un singolo nome di variabile, non è considerato un espressione di nomi di colonna ed è invece valutata in ambito chiamare.

Così dt[x] cercherà di valutare x nel perimetro chiamando (in questo caso l'ambiente globale)

Si può ovviare a questo utilizzando ( o { o force

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

(+1) uso interessante della funzione 'forza'. Come funziona 'force' in questo caso? Come altera ambiente/ambito? – Nishanth

+0

Un po 'più informazioni su _why_ [qui] (http://r.789695.n4.nabble.com/Indexing-by-a-logical-column-tp4665153p4665142.html). –

+0

'force' fondamentalmente impedisce che venga interpretato come una singola variabile (questo viene fatto con un po 'di calcolo sulla chiamata all'interno di' [.data.table') 'force' quindi forza la valutazione di' x', che restituirà 'x' all'interno dello scope data.table. – mnel

4

x non è definito nell'ambiente globale. Se provi questo,

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

Funzionerebbe. O questo:

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

EDIT:

secondo la documentazione parametro j prende nome di colonna, infatti:

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

quindi, il parametro i accetta sia espressione numerica o logica (come x stesso dovrebbe essere), tuttavia sembra (data.table) non può vedere x come logico senza questo:

> 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

Non sono sicuro che questo sia un problema, 'x' non è definito nell'ambiente globale ma' dt [x == T] 'funziona. – djhurio

+0

Hai ragione, tuttavia questo errore 'Errore in eval (expr, envir, enclos): l'oggetto 'x' non trovato 'lo indica. Quindi, probabilmente hai evidenziato un possibile errore – Michele

+0

@djhurio In entrambe le parti 'i' e' j' della documentazione di '[.data.table' si dice che l'espressione'e valutata all'interno del frame di data.table (cioè vede i nomi delle colonne come se fossero variabili) '. Tuttavia, nel parametro 'i' sembra che sia necessaria un'espressione esplicita come' == 'o' as.logical'. – Michele

2

Questo dovrebbe funziona anche ed è discutibilmente più naturale:

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