983 votes

Supprimer la trame de données R colonnes

J'ai un certain nombre de colonnes que je voudrais déposer à partir d'une trame de données. Je sais que nous pouvons nous en débarrasser en utilisant quelque chose comme:

df$x <- NULL

mais j'espérais le faire avec moins de commandes.

Aussi, je sais que je pourrais utiliser ce:

df[ -c(1,3:6, 12) ]

mais je crains que la position relative de mes variables peuvent changer.

Compte tenu de la puissance de R, j'ai pensé que je voudrais demander à voir si il y a une autre façon, au-delà de déposer chaque colonne 1 par 1.

Merci à l'avance.

1007voto

Joris Meys Points 38980

Vous pouvez utiliser une simple liste de noms :

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[,!(names(DF) %in% drops)]

Ou, alternativement, vous pouvez faire une liste de ceux à garder et se référer à eux par leur nom :

keeps <- c("y","a")
DF[keeps]

EDIT : Pour ceux pas encore familiarisé avec l' drop argument de la fonction d'indexation, si vous voulez garder une colonne comme un bloc de données, vous ne:

keeps <- "y"
DF[,keeps,drop=FALSE]

drop=TRUE (ou de ne pas le mentionner) passera inutile dimensions, et donc le retour d'un vecteur avec les valeurs de la colonne y.

506voto

Prasad Chalasani Points 9020

Il y a aussi la `` commande, utile si vous savez quelles colonnes vous voulez :

Mis à jour après le commentaire de @hadley : pour supprimer les colonnes a, c vous pourriez faire :

130voto

Joshua Ulrich Points 68776

Vous pouvez utiliser `` comme ceci :

45voto

mnel Points 48160

Si vous souhaitez supprimer les colonnes par référence et d'éviter la copie interne associée data.frames , alors vous pouvez utiliser l' data.table paquet et la fonction :=

Vous pouvez passer d'un caractère de vecteur de noms à la gauche de l' := de l'opérateur, et NULL comme le membre de droite.

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

Si vous souhaitez prédéfinir les noms de personnages de vecteur à l'extérieur de l'appel à l' [, enveloppez-le nom de l'objet en () ou {} de la force de la LHS à être évalués dans le contexte appelant non pas comme un nom dans le champ d'application de l' DT.

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

Vous pouvez également utiliser set, ce qui évite la surcharge d' [.data.table, et travaille également pour d' data.frames!

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)

44voto

BondedDust Points 105234

Il est potentiellement plus puissant de la stratégie basée sur le fait que grep() retourne un vecteur numérique. Si vous avez une longue liste de variables comme je le fais dans un de mes jeu de données, certaines variables qui se terminent par ".Un" et d'autres qui se terminent par ".B" et que vous souhaitez seulement ceux qui se terminent par ".Un" (avec toutes les variables qui ne correspondent pas, en soit le motif, faites ceci:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

Pour le cas à portée de main, à l'aide de Joris Meys exemple, il pourrait ne pas être aussi compact, mais il serait:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]

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