Seleziona più colonne in data.table in base ai loro indici numerici


143

Come possiamo selezionare più colonne usando un vettore dei loro indici numerici (posizione) in data.table?

Ecco come faremmo con un data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

Risposte:


185

Per le versioni di data.table >= 1.9.8 , le seguenti funzioni funzionano:

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

Per le versioni di data.table < 1.9.8 (per le quali la selezione della colonna numerica ha richiesto l'uso di with = FALSE), vedere questa versione precedente di questa risposta. Vedi anche NEWS su v1.9.8, CAMBIAMENTI POTENZIALMENTE ROTANTI, punto 3.


1
Nessun problema. Confronta anche dt[,"a"]e dt[,"a", with=FALSE]per vedere quale opzione utile è davvero.
Josh O'Brien,

3
un modo per farlo senza? ad esempio DT[,list(b:c), poiché ho trovato conveniente trasformare le colonne direttamente nella tabella dei dati, ad esempio, posso farlo DT[,list(1/b,2*c)], ma non funziona con.
Jamborta,

2
In with=FALSEquesto caso non sarà necessario modificare il pacchetto : github.com/Rdatatable/data.table/issues/…
Frank,

1
@Frank - Questa è una grande notizia! Grazie per averlo portato alla mia attenzione. Una volta che la modifica si farà strada nella versione di data.table distribuita su CRAN, modificherò questa risposta per annunciare la modifica. (E per favore - tu o chiunque altro che legga questo - sentiti libero di chiamarmi con un promemoria non appena ciò accade.)
Josh O'Brien,

2
@Valentas Divertente che dovresti chiedere. Non esiste un data.framemodo compatibile per l'uso with=FALSE. Tuttavia, come di circa 3 settimane fa, la versione di sviluppo di data.table è stato modificato per chiamate come dt[, 2], dt[, 2:3], dt[, "b"], e dt[, c("b", "c")]si comportano allo stesso come fanno nel con data.frames , senza dover impostare in modo esplicito with=FALSE. È fantastico! Vedere qui per il commit specifico, inclusa la voce NEWS che descrive la modifica.
Josh O'Brien,

43

È un po 'prolisso, ma mi sono abituato a usare la .SDvariabile nascosta .

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

È un po 'una seccatura, ma non perdi altre funzionalità di data.table (non credo), quindi dovresti essere ancora in grado di utilizzare altre funzioni importanti come join table ecc.


6
Non è una seccatura e molto utile quando si crea programmaticamente l'elenco delle colonne
Chris,

39

Se vuoi usare i nomi delle colonne per selezionare le colonne, usa semplicemente .(), che è un alias per list():

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4

19

Dalla v1.10.2 in poi, puoi anche usare ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
Grazie per questa risposta Ho anche scoperto che dt[, !..keep_cols]e dt[, -..keep_cols] funziona come previsto!
IceCreamToucan

3

@ Tom, grazie mille per aver segnalato questa soluzione. Mi va benissimo.

Stavo cercando un modo per escludere solo una colonna dalla stampa e dall'esempio sopra. Per escludere la seconda colonna puoi fare qualcosa del genere

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.