2015-10-26 16 views
7

uso il seguente linguaggio per la selezione condizionale colonne da una data.frame:Idiom per selezionare condizionale colonne da una data.table

DF = data.frame(a = 1:3,b = letters[1:3],c = LETTERS[1:3]) 
someCondition <- FALSE 

# use `if(someCondition)` to conditionally include column 'c' 
DF[,c('a','b',if(someCondition)'c')] 
:> a b 
:> 1 1 a 
:> 2 2 b 
:> 3 3 c 

ma l'equivalente non funziona con b/c NULL di data.table I valori non vengono eliminati dalle liste stesso modo in cui vengono eliminati dalla concatenazione:

DT = as.data.table(DF) 
DT[,.(a,b,if(someCondition)c)] 
:> Error in setnames(jval, jvnames) : 
:> Can't assign 3 names to a 2 column data.table 

ho definito una funzione chiamata .. che è un lavoro intorno:

.. <- function(...){ 
    x = list(...) 
    x= x[!sapply(x,is.null)] 
    x 
} 
DT[,..(a,b,if(someCondition)c)] 
:> V1 V2 
:> 1: 1 a 
:> 2: 2 b 
:> 3: 3 c 

ma cerca un po 'di impegno per includere la mia funzione per eseguire un'operazione che è così comune. C'è un modo più idiomatico di selezionare condizionatamente le colonne da un data.table?

+7

'\. [.noquote \' (DT, c ('a', 'b', if (someCondition) 'c')) 'o' DT [, c ('a', 'b', se (someCondition) 'c'), con = FALSE] 'se non puoi apprezzare le meraviglie di' [.noquote'. – Frank

+2

Non sono sicuro del motivo per cui questo è contrassegnato come duplicato .. Si prega di inviare una segnalazione di errore. – Arun

+0

@akrun, chiaramente 'DT [,. (A, b, if (someCondition) c)]' non funziona come dovrebbe. Perché dovrebbe essere un duplicato? – Arun

risposta

2

Penso che l'argomento .SDcols Fa quello che vuoi. Nell'esempio sopra per data.table DF,

DF[, .SD, .SDcols= c("a","b", if(someCondition) "c")] 

Agirà come nel tuo data.frame. Puoi anche implementarlo come nell'esempio seguente.

DF[, .SD, .SDcols=if(someCondition) c("a","b","c") else c("a","b")] 

eseguirà la selezione desiderata. In una riga precedente, potresti creare costruzioni più elaborate dei vettori veri e falsi (che potrebbero vanificare lo scopo di mantenere la cosa succinta).

Problemi correlati