Sélectionnez plusieurs colonnes dans data.table par leurs indices numériques

143

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

C'est ainsi que nous ferions avec un data.frame:

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

Réponses:

185

Pour les versions de data.table >= 1.9.8 , les éléments suivants fonctionnent tout simplement:

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 lesquelles la sélection de colonne numérique nécessitait l'utilisation de with = FALSE), consultez cette version précédente de cette réponse. Voir aussi ACTUALITÉS sur la v1.9.8, CHANGEMENTS POTENTIELLEMENT RUPTANTS, point 3.

Josh O'Brien
la source
1
Aucun problème. Comparez aussi dt[,"a"]et dt[,"a", with=FALSE]voyez à quel point c'est une option utile.
Josh O'Brien
3
une façon de faire cela sans avec? par exemple DT[,list(b:c), comme j'ai trouvé pratique de transformer les colonnes directement dans la table de données, par exemple je peux le faire DT[,list(1/b,2*c)], mais cela ne fonctionne pas avec.
jamborta
2
Une modification du package rendra with=FALSEinutile dans ce cas: github.com/Rdatatable/data.table/issues/…
Frank
1
@Frank - C'est une excellente nouvelle! Merci de l'avoir porté à mon attention. Une fois que ce changement fait son chemin dans la version de data.table distribuée sur CRAN, je modifierai cette réponse pour annoncer le changement en haut. (Et s'il vous plaît - vous ou toute autre personne qui lit ceci - n'hésitez pas à m'envoyer un ping avec un rappel dès que cela se produit.)
Josh O'Brien
2
@Valentas Drôle, vous devriez demander. Il n'y a pas de manière data.framecompatible d'utiliser with=FALSE. Cependant, il y a environ 3 semaines, la version de développement de data.table a été modifié pour des appels comme dt[, 2], dt[, 2:3], dt[, "b"]et dt[, c("b", "c")]se comporter comme ils le font dans le avec data.frames sans avoir à définir explicitement with=FALSE. C'est génial! Voir ici pour le commit particulier, y compris l'entrée NEWS décrivant le changement.
Josh O'Brien
43

C'est un peu verbeux, mais je me suis habitué à utiliser la .SDvariable cachée .

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

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

À M
la source
6
Pas un tracas et très utile lors de la création de la liste de colonnes par programme
Chris
39

Si vous souhaitez utiliser des noms de colonnes 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
R Yoda
la source
19

À 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]
rafa.pereira
la source
3
Merci pour cette réponse. J'ai également trouvé cela dt[, !..keep_cols]et dt[, -..keep_cols] fonctionne comme prévu!
IceCreamToucan
3

@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 ça

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