2015-02-04 11 views
6

Ho un data.table e voglio creare una nuova variabile in base a più condizioni in un'istruzione ifelse ma quello che ottengo di conseguenza sembra essere strano.ifelse con condizioni multiple per la creazione di una nuova variabile in data.table R

Immaginiamo il seguente esempio semplificato.

DT <- data.table(replicate(2,sample(0:1,5,replace=TRUE))) 

    V1 V2 
1: 1 0 
2: 1 1 
3: 1 1 
4: 1 0 
5: 0 1 

Voglio creare una nuova variabile basata sulle variabili esistenti. Io uso la dichiarazione ifelse come segue:

DT[, new.var := ifelse(V1 > 0, 1, 0)] 
DT[, new.var.mult := ifelse(V1 > 0 && V2 > 0, 1, 0)] 

Tuttavia, questo non funziona in caso di condizioni multiple. (Sono consapevole che questo compito potrebbe essere risolto facilmente senza condizione multipla ma il mio problema è più complicato.)

V1 V2 new_var new_var_multiple 
1: 1 0  1    0 
2: 1 1  1    0 
3: 1 1  1    0 
4: 1 0  1    0 
5: 0 1  0    0 

Quale potrebbe essere il problema?

+3

Non avete bisogno di un 'ifelse' qui, basta fare' DT [, new_var_multiple: = (V1> 0 e V2> 0) + 0] ' –

risposta

5

È necessario utilizzare solo una e commerciale (&) per confrontare i vettori.

DT[, new.var.mult := ifelse(V1 > 0 & V2 > 0, 1, 0)] 

Illustrazione:

> c(TRUE, TRUE) & c(FALSE, TRUE) 
[1] FALSE TRUE 
> c(TRUE, TRUE) && c(FALSE, TRUE) 
[1] FALSE 
+7

Evitare 'ifelse' all'interno di data.tables. Non penso sia ottimizzato (ancora?). Farei semplicemente qualcosa come 'DT [, x: =" a "]; DT [condition, x: = "b"] 'se il commento di David non si applica. – Roland

+0

@Roland è ancora così? – posdef

+1

@posdef Ci credo, se non mi sono perso qualcosa. Dubito che l'ottimizzazione di "ifelse" sia una priorità per Matt e Arun. I programmatori R più avanzati sembrano evitare "ifelse" comunque. – Roland