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.
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
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.
(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.
Les réponses affichées sont très bonnes lorsque vous travaillez 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 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.
Avec cela, vous pouvez supprimer la column
et stocker variable
dans un autre variable
.
df = subset(data, select = -c(genome) )
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