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?
'\. [.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
Non sono sicuro del motivo per cui questo è contrassegnato come duplicato .. Si prega di inviare una segnalazione di errore. – Arun
@akrun, chiaramente 'DT [,. (A, b, if (someCondition) c)]' non funziona come dovrebbe. Perché dovrebbe essere un duplicato? – Arun