155 votes

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

Comment peut-on sélectionner plusieurs colonnes en utilisant un vecteur de leurs indices numériques (position) dans le fichier 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

196voto

Josh O'Brien Points 68397

Pour les versions de table.de.données >= 1.9.8 les éléments suivants fonctionnent tous :

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 table.de.données < 1.9.8 (pour lesquels la sélection numérique des colonnes a nécessité l'utilisation de with = FALSE ), voir cette version précédente de cette réponse. Voir aussi NOUVELLES sur la v1.9.8, POTENTIALLY BREAKING CHANGES, point 3.

1 votes

Aucun problème. Comparez aussi dt[,"a"] y dt[,"a", with=FALSE] pour voir quelle option utile c'est vraiment.

3 votes

Est-il possible de faire cela sans avec ? par exemple DT[,list(b:c) J'ai trouvé pratique de transformer les colonnes directement dans la table de données, par exemple en faisant ce qui suit DT[,list(1/b,2*c)] mais cela ne fonctionne pas avec avec.

0 votes

Vous pourriez utiliser .SDcols=2:3 ou le vecteur de caractères des noms. Je ne suis pas sûr de ce que vous voulez dire concernant l'exemple qui ne fonctionne pas avec avec

45voto

Tom Points 701

C'est un peu verbeux, mais j'ai pris l'habitude d'utiliser l'option cachée. .SD variable.

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 les autres fonctionnalités de data.table (je ne pense pas), donc vous devriez toujours pouvoir utiliser d'autres fonctions importantes comme les tables de jonction, etc.

39voto

R Yoda Points 3698

Si vous souhaitez utiliser la colonne noms pour sélectionner les colonnes, il suffit d'utiliser .() 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

22voto

rafa.pereira Points 5485

À partir de la version 1.10.2, vous pouvez également utiliser l'application ..

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

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

dt[, ..keep_cols]

3voto

Bhoom Suktitipat Points 151

@Tom, merci beaucoup de m'avoir indiqué cette solution. Elle fonctionne très 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)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X