web-dev-qa-db-fra.com

Comment renommer une colonne dans un data.frame?

Je sais que si j'ai un bloc de données avec plus d'une colonne, je peux utiliser 

colnames(x) <- c("col1","col2")

renommer les colonnes. Comment puis-je faire cela s'il ne s'agit que d'une colonne? Signifiant un vecteur ou un cadre de données contenant une seule colonne.

Exemple:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]
265
screechOwl
colnames(trSamp)[2] <- "newname2"

tente de définir le nom de la deuxième colonne. Votre objet n'a qu'une colonne, la commande génère donc une erreur. Cela devrait suffire:

colnames(trSamp) <- "newname2"
267
Joshua Ulrich

C'est une façon généralisée de ne pas avoir à se rappeler l'emplacement exact de la variable:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Ce code fait à peu près ce qui suit:

  1. names(df) examine tous les noms de la df
  2. [names(df) == old.var.name] extrait le nom de variable que vous voulez vérifier
  3. <- 'new.var.name' assigne le nouveau nom de variable.
469
Side_0o_Effect
colnames(df)[colnames(df) == 'oldName'] <- 'newName'
75
zongshiwujie

C'est une vieille question, mais il convient de noter que vous pouvez maintenant utiliser setnames à partir du paquetage data.table

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)
66
Ricardo Saporta

Cela peut également être fait en utilisant le paquet plyr de Hadley et la fonction rename.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

Vous pouvez renommer par le nom (sans connaître la position) et effectuer plusieurs renommage à la fois. Après une fusion, par exemple, vous pourriez vous retrouver avec:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Que vous pouvez ensuite renommer en une étape en utilisant:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13
48
alexplanation

Je pense que le meilleur moyen de renommer les colonnes est d'utiliser le paquet dplyr comme ceci:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Cela fonctionne de la même manière pour renommer une ou plusieurs colonnes dans n'importe quel jeu de données.

25
Luis Vazquez

J'aime le style suivant pour renommer les noms de colonne dataframe un par un.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

où 

which(colnames(df) == 'old_colname')

retourne par l'index de la colonne spécifique.

10
jshepherd

Je trouve que le moyen le plus pratique de renommer une colonne consiste à utiliser dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • fonctionne bien dans les chaînes de tuyaux
  • pratique lorsque les noms sont stockés dans des variables
  • fonctionne avec un nom ou un index de colonne
  • clair et compact
6
Moody_Mudskipper

Vous pouvez utiliser le rename.vars dans le package gdata.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Ceci est particulièrement utile lorsque vous avez plus d'un nom de variable à modifier ou si vous souhaitez ajouter ou ajouter du texte aux noms de variable, vous pouvez alors effectuer les opérations suivantes:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Pour un exemple d’ajout de texte à un sous-ensemble de noms de variables, voir: https://stackoverflow.com/a/28870000/180892

5
Jeromy Anglim

Essayer:

colnames(x)[2] <- 'newname2'
4
NPE

Vous pouvez également essayer 'upData' à partir du paquet 'Hmisc'.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))

3
ansek

C'est probablement déjà fait, mais je jouais avec renommer des champs tout en recherchant une solution et en essayant sur un coup de tête. Travaillé pour mes besoins. 

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

Modifier commence ici ....

Cela fonctionne aussi bien. 

df <- rename(df, c("oldColName" = "newColName"))
2
Scottieie

Si vous savez que votre structure de données ne comporte qu'une seule colonne, vous pouvez utiliser: names(trSamp) <- "newname2"

2
user399470

La question du PO a bien été résolue. Cependant, voici une astuce qui peut être utile dans certaines situations: correspondance partielle du nom de la colonne, quelle que soit sa position dans un cadre de données:

Correspondance partielle sur le nom:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Autre exemple: correspondance partielle sur la présence de "ponctuation":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

C'étaient des exemples que j'avais à traiter aujourd'hui, je pensais qu'il valait peut-être la peine de les partager.

0
PatrickT

Je voudrais simplement ajouter une nouvelle colonne au cadre de données avec le nom que je veux et obtenir les données pour cela de la colonne existante. comme ça:

dataf$value=dataf$Article1Order

alors je supprime l'ancienne colonne! comme ça:

dataf$Article1Order<-NULL

Ce code peut sembler idiot! Mais cela fonctionne parfaitement ...

0
Niloufar

Je voudrais simplement changer un nom de colonne à l'ensemble de données avec le nouveau nom que je veux avec le code suivant: names (dataset) [valeur_index] <- "nouveau_nom_colonne"

0
Parthiban M