web-dev-qa-db-fra.com

Sélectionnez plusieurs colonnes dans data.table en fonction de leurs index numériques

Comment pouvons-nous sélectionner plusieurs colonnes en utilisant un vecteur de leurs index numériques (position) dans data.table?

Voici comment nous ferions avec un data.frame:

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

Pour les versions de data.table >= 1.9.8, tout ce qui suit fonctionne:

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

Pour les versions de data.table < 1.9.8 (pour lequel la sélection de colonne numérique nécessitait l'utilisation de with = FALSE), voir cette version précédente de cette réponse. Voir aussi NEWS , Modifications de la v1.9.8/MODIFICATION POTENTIELLEMENT rompue/point 2.

178
Josh O'Brien

C'est un peu bavard, mais je me suis habitué à utiliser la variable cachée .SD.

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

C'est un peu fastidieux, mais vous ne perdez pas d'autres fonctionnalités de data.table (je ne pense pas), vous devriez donc pouvoir utiliser d'autres fonctions importantes comme les tables de jointure, etc.

40
Tom

Si vous voulez utiliser la colonne noms pour sélectionner les colonnes, utilisez simplement .(), qui est un alias pour 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
37
R Yoda

À partir de la v1.10.2, vous pouvez également utiliser ..

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

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

dt[, ..keep_cols]
17
rafa.pereira

@Tom, merci beaucoup d'avoir signalé cette solution. Ça marche bien pour moi.

Je cherchais un moyen d'exclure simplement une colonne de l'impression et de l'exemple ci-dessus. Pour exclure la deuxième colonne, vous pouvez faire quelque chose comme ceci

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)]
3
Bhoom Suktitipat