317 votes

Suppression d'une colonne entière d'un data.frame en R

Quelqu'un sait-il comment supprimer une colonne entière d'un cadre de données dans R ? Par exemple, si l'on me donne ce cadre de données :

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

et je veux supprimer la 2ème colonne.

2 votes

489voto

Joshua Ulrich Points 68776

Vous pouvez le régler sur NULL .

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

Comme indiqué dans les commentaires, voici d'autres possibilités :

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

Vous pouvez supprimer plusieurs colonnes via :

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

Soyez prudent avec le sous-ensemble de la matrice, car vous pouvez vous retrouver avec un vecteur :

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

59 votes

Ou vous pouvez utiliser : Data <- Data[,-2]

0 votes

Ian, as-tu vraiment besoin du "," ?

2 votes

Avec la virgule, vous pouvez également contrôler l'argument "drop", qui, lorsqu'il est FAUX, signifie que le data.frame reste un data.frame lorsque le résultat ne consiste qu'en une seule colonne - sans la virgule, vous obtiendrez toujours un data.frame, qu'il reste plusieurs colonnes ou une seule - drop est ignoré pour l'extraction [-2].

85voto

Prasad Chalasani Points 9020

Pour supprimer une ou plusieurs colonnes par leur nom, lorsque les noms des colonnes sont connus (et non pas déterminés au moment de l'exécution), j'aime la méthode subset() syntaxe. Par exemple, pour le cadre de données

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

pour supprimer uniquement le a colonne que vous pourriez faire

Data <- subset( Data, select = -a )

et de retirer le b et d colonnes que vous pourriez faire

Data <- subset( Data, select = -c(d, b ) )

Vous pouvez supprimer toutes les colonnes entre d et b avec :

Data <- subset( Data, select = -c( d : b )

Comme je l'ai dit plus haut, cette syntaxe ne fonctionne que lorsque les noms des colonnes sont connus. Elle ne fonctionnera pas si les noms des colonnes sont déterminés par programme (c'est-à-dire s'ils sont assignés à une variable). Je vais reproduire cet avertissement à partir du ?subset documentation :

Attention :

Il s'agit d'une fonction pratique destinée à être utilisée de manière interactive. Pour la programmation, il est préférable d'utiliser les fonctions standard de sous-ensemble standard comme '[', et en particulier l'évaluation non standard de l'argument de l'argument 'subset' peut avoir des conséquences inattendues.

38voto

ceiling cat Points 1523

(Pour être complet) Si vous voulez supprimer les colonnes par nom, vous pouvez le faire :

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

Y compris drop = F garantit que le résultat sera toujours un data.frame même s'il ne reste qu'une seule colonne.

24voto

Chase Points 27342

Les réponses affichées sont très bonnes lorsque l'on travaille avec data.frame s. Cependant, ces tâches peuvent être assez inefficaces du point de vue de la mémoire. Avec des données volumineuses, la suppression d'une colonne peut prendre un temps anormalement long et/ou échouer à cause de out of memory erreurs. Paquet data.table contribue à résoudre ce problème avec le := opérateur :

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

Je devrais mettre en place un exemple plus important pour montrer les différences. Je mettrai cette réponse à jour à un moment donné.

3 votes

Le site data.table::set peut être utilisée sur data.frame pour supprimer ou modifier une colonne instantanément, sans faire de copies. Voir ici

12voto

Nirali Khoda Points 320

Avec cela, vous pouvez supprimer le column et stocker variable dans un autre variable .

df = subset(data, select = -c(genome) )

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