web-dev-qa-db-fra.com

Supprimer une colonne entière d'un data.frame dans R

Est-ce que quelqu'un sait comment supprimer une colonne entière d'un data.frame dans R? Par exemple si on me donne ce data.frame:

> 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.

247
Nanami

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, il existe 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 la sous-matrice, car vous pouvez vous retrouver avec un vecteur:

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

Pour supprimer une ou plusieurs colonnes par leur nom, lorsque les noms des colonnes sont connus (par opposition à leur détermination au moment de l'exécution), j'aime bien la syntaxe subset(). Par exemple. pour la trame de données

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

pour ne supprimer que la colonne a que vous pourriez faire

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

et pour supprimer les colonnes b et d

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 de colonne sont connus. Cela ne fonctionnera pas si, disons, les noms des colonnes sont déterminés par programme (c'est-à-dire affectés à une variable). Je reproduirai cet avertissement à partir de la documentation ?subset:

Attention:

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

63
Prasad Chalasani

(Pour être complet) Si vous souhaitez supprimer des colonnes par leur nom, vous pouvez procéder comme suit:

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]

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

22
ceiling cat

Les réponses affichées sont très bonnes lorsque vous travaillez avec data.frames. 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 inhabituellement long et/ou échouer à cause d'erreurs out of memory. Le package data.table aide à résoudre ce problème avec l'opérateur :=:

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

Je devrais rassembler un plus grand exemple pour montrer les différences. Je mettrai à jour cette réponse avec cela.

21
Chase

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

df = subset(data, select = -c(genome) )
5
Nirali Khoda

Il existe plusieurs options pour supprimer une ou plusieurs colonnes avec dplyr::select() et certaines fonctions auxiliaires. Les fonctions d'assistance peuvent être utiles car certaines ne nécessitent pas de nommer toutes les colonnes spécifiques à supprimer. Notez que pour supprimer des colonnes à l'aide de select(), vous devez utiliser un - initial pour annuler les noms de colonne.

Utilisation des exemples de données dplyr::starwars pour certaines variétés dans les noms de colonne:

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

Vous pouvez également déposer par numéro de colonne:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10
4
sbha