Devo rilasciare una colonna da un data.frame contenente alcune centinaia di colonne.Idioma per rilasciare una singola colonna in un data.table
Con un data.frame
, userei subset
per farlo comodamente:
> dat <- data.table(data.frame(x=runif(10),y=rep(letters[1:5],2),z=runif(10)),key='y')
> subset(dat,select=c(-z))
x y
1: 0.1969049 a
2: 0.7916696 a
3: 0.9095970 b
4: 0.3529506 b
5: 0.4923602 c
6: 0.5993034 c
7: 0.1559861 d
8: 0.9929333 d
9: 0.3980169 e
10: 0.1921226 e
Ovviamente questo funziona ancora, ma sembra non molto data.table
-come idioma. Potrei costruire manualmente un elenco dei nomi delle colonne ho voluto mantenere, che sembra un po 'più data.table
-come:
> dat[,list(x,y)]
x y
1: 0.1969049 a
2: 0.7916696 a
3: 0.9095970 b
4: 0.3529506 b
5: 0.4923602 c
6: 0.5993034 c
7: 0.1559861 d
8: 0.9929333 d
9: 0.3980169 e
10: 0.1921226 e
Ma poi ho dovuto costruire un tale elenco, che è goffo.
È subset
il modo corretto per rilasciare comodamente una o due colonne o provoca un calo di prestazioni? In caso contrario, qual è il modo migliore?
Modifica
Benchmark:
> dat <- data.table(data.frame(x=runif(10^7),y=rep(letters[1:10],10^6),z=runif(10^7)),key='y')
> microbenchmark(subset(dat,select=c(-z)), dat[,list(x,y)])
Unit: milliseconds
expr min lq median uq max
1 dat[, list(x, y)] 102.62826 167.86793 170.72847 199.89789 792.0207
2 subset(dat, select = c(-z)) 33.26356 52.55311 53.53934 55.00347 180.8740
Ma in realtà dove si può importare di più è per la memoria se subset
copia l'intera data.table
.
Una domanda: qual è la vostra intenzione di eliminare questa colonna? Voglio dire cosa hai intenzione di fare con i dati risultanti.table? – Arun
@Arun Il caso particolare che mi ha fatto chiedere, ho sbagliato il nome di una colonna durante la creazione con ': =' e volevo rilasciarlo. Ma viene fuori tutto il tempo che scaricare una colonna o due è a portata di mano. –
Come spiega @mnel, se vuoi semplicemente rimuovere, puoi usare direttamente l'operatore ': =' e se vuoi eseguire calcoli senza questa colonna, puoi sempre usare '.SDcols'. Quindi, puoi evitare del tutto la soluzione 'subset' /' with = FALSE'. – Arun