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

267

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.

Nanami
la source
1
Duplicata possible des colonnes Drop dans la trame de données R
jangorecki

Réponses:

414

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 quelques 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 matrice, car vous pouvez vous retrouver avec un vecteur:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame
Joshua Ulrich
la source
48
ou vous pouvez utiliser: Data <- Data [, - 2]
Ian Fellows
2
avec la virgule, vous pouvez également contrôler l'argument "drop", qui, lorsque FALSE signifie que data.frame reste un data.frame lorsque le résultat se compose d'une seule colonne - sans la virgule, vous obtiendrez toujours un data.frame si plusieurs colonnes sont gauche ou juste un - drop est ignoré pour l'extraction [-2]
mdsumner
3
@mdsumner Data[-2]n'a pas besoin d' dropargument car il revient toujours data.framede data.frame. Et je pense que c'est beaucoup mieux pour les colonnes localisées (et uniquement les colonnes) dans data.frame(et c'est plus rapide). Vérifier: cars[-1](un col data.frame) ou mieux cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek
1
Vous pouvez également écrire Data [2] <- NULL
Wojciech Sobala
11
Astuce mineure: lors de la suppression de plusieurs colonnes Data[c(1,2)]<-list(NULL)est nécessaire.
Marek
69

Pour supprimer une ou plusieurs colonnes par nom, lorsque les noms des colonnes sont connus (au lieu d'être déterminés au moment de l'exécution), j'aime la subset()syntaxe. Par exemple pour la trame de données

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

pour supprimer uniquement la acolonne que vous pourriez faire

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

et pour supprimer les colonnes bet que dvous pourriez faire

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

Vous pouvez supprimer toutes les colonnes entre det bavec:

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. Cela ne fonctionnera pas lorsque les noms des colonnes sont déterminés par programme (c'est-à-dire attribués à une variable). Je reproduis cet avertissement à partir de la ?subsetdocumentation:

Avertissement:

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 de sous-ensemble standard comme «[», et en particulier l'évaluation non standard de l'argument «sous-ensemble» peut avoir des conséquences imprévues.

Prasad Chalasani
la source
26

(Pour être complet) Si vous souhaitez supprimer des 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]

L'inclusion drop = Fgarantit que le résultat sera toujours un data.framemême s'il ne reste qu'une colonne.

chat de plafond
la source
22

Les réponses affichées sont très bonnes lorsque vous travaillez avec l' data.frameart. 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 en raison d' out of memoryerreurs. Le package data.tablepermet de 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 exemple plus grand pour montrer les différences. Je mettrai à jour cette réponse à un moment donné avec cela.

Chasse
la source
3
La data.table::setfonction peut être utilisée sur data.frames pour supprimer ou modifier une colonne instantanément, sans faire de copie. Voir ici
GSee
8

Il existe plusieurs options pour supprimer une ou plusieurs colonnes avec dplyr::select()et certaines fonctions d'assistance. 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 interligne- début pour annuler les noms de colonne.

Utilisation des dplyr::starwarsexemples de données pour une variété de noms de colonnes:

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
sbha
la source
Très bonne réponse. Une idée sur la façon de supprimer une colonne qui contient une certaine valeur dans l'une de ses lignes (pas dans son nom de colonne comme vous l'avez proposé ci-dessus)?
Laura K
df [, - which (sapply (df, function (x) any (x == a)))]], où df est votre bloc de données et a est votre valeur spécifique, par exemple: mtcars [, - which (sapply (mtcars, function (x) any (x == 4)))]
Nanami
7

Avec cela, vous pouvez supprimer columnet stocker variabledans un autre variable.

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