Comment renommer une seule colonne dans un data.frame?


335

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

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

pour renommer les colonnes. Comment dois-je procéder si ce n'est qu'une colonne? Signification d'un vecteur ou d'un bloc 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]

4
La solution de @ aix fonctionnera pour un data.frame à 1 colonne. Vous êtes probablement dérouté par l' drop=TRUEargument par défaut de [, qui provoque la conversion d'un objet "1 colonne" en vecteur ... et les vecteurs n'en ont pas colnames. Un exemple de ce que vous avez essayé serait très utile.
Joshua Ulrich

2
cela fonctionne si vous utilisez "colnames (x) [1] <- 'newname2'"
screechOwl

Réponses:


345
colnames(trSamp)[2] <- "newname2"

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

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Cela ne semble pas fonctionner si le nom de la colonne est quelque chose comme "A,B,C,X,Y,Z"où je veux le renommer en Yutilisant testData[379] <- "Y".
Chetan Arvind Patil

576

Il s'agit d'une manière généralisée dans laquelle vous n'avez pas à vous souvenir de 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 du df
  2. [names(df) == old.var.name] extrait le nom de variable que vous souhaitez vérifier
  3. <- 'new.var.name' attribue le nouveau nom de variable.

5
Je suis aussi assez nouveau avec R, j'ai adoré cette solution! J'ai en fait vérifié ce qu'il fait, et je pense qu'il vaut la peine de spécifier qu'il [names(df) == old.var.name]retourne en fait un vecteur avec des valeurs vraies / fausses. Il a donc le potentiel de changer plusieurs noms de colonnes si, par exemple, des expressions régulières sont utilisées.
mikyatope

3
Pour des résultats d'expression régulière, utilisez quelque chose comme names(df) = sub('pattern', 'replacement', names(df)). Sinon, vous essayez de définir plusieurs colonnes avec le même nom.
We Are All Monica

40
Des sentiments mitigés ... dans un monde parfait, où les langages de programmation parfaits abondent, faudrait-il vraiment autant de touches pour changer le nom d'une seule colonne? J'adore R mais parfois je veux l'étrangler pour ce type de raisons.
tumultous_rooster

4
Comment n'y a-t-il pas de fonction wrapper pour cela dans la base?
ifly6

1
Comme nous le souhaitons tous! Je ne sais pas pour le moment, mais à l'époque il n'y avait pas de wrapper dans la base
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
J'aime cette solution car vous pouvez référencer le nom de la colonne par son nom, au lieu d'exiger de savoir de quelle colonne de numéro il s'agit. Mieux pour un plus grand nombre de fonctionnalités.
Cybernetic

1
J'ai une petite extension à la question et à cette réponse. J'ai une trame de données avec une colonne qui contient les lettres «snp» . Je veux le renommer en «marqueur» . Mais je veux utiliser une expression régulière pour le faire. Apparemment, le code que j'ai est imparfait:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"car la colonne n'est pas renommée. Si je le fais, names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"il est renommé. Qu'est-ce que je rate?
Sander W. van der Laan

76

C'est une vieille question, mais il convient de noter que vous pouvez maintenant l'utiliser à setnamespartir du data.tablepackage.

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)

6
ou setNamesdepuis la base R.
PatrickT

53

Cela peut également être fait en utilisant le plyrpackage de Hadley et la renamefonction.

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 renommages à la fois. Après avoir effectué 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 seule é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

7
renameest désormais également une fonction du dplyrpackage.
Sam Firke

36

Je pense que la meilleure façon de renommer les colonnes est d'utiliser le package dplyr comme ceci:

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

Il en va de même pour renommer une ou plusieurs colonnes dans n'importe quel ensemble de données.


12

J'aime le style suivant pour renommer les noms de colonne de trame de données un par un.

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

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

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


1
+1 pour avoir donné à l'utilisateur la possibilité d'utiliser l'ancien nom réel :)

1
Quelle est ici la différence par rapport à la solution de @zongshiwujie?
buhtz

which()n'est pas nécessaire.
sindri_baldur

12

Je trouve que la façon la plus pratique de renommer une seule colonne est d'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

Vous pouvez utiliser le rename.varsdans le gdatapackage.

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 faire quelque chose comme:

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


C'est le plus simple, merci. Eu des problèmes avec le paquet dplyr.
DannyB

4

Essayer:

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

8
C'est ce qui a jeté l'erreur sur laquelle OP a posé des questions (dans son édition). Cela ne fonctionnera pas, car le dataframe n'a qu'une seule colonne.

. @ NPE - Cela ne semble pas fonctionner si le nom de la colonne est quelque chose comme "A,B,C,X,Y,Z"où je veux le renommer en Yutilisant testData[379] <- "Y".
Chetan Arvind Patil

4

C'est probablement déjà là-bas, mais je jouais avec renommer les champs tout en recherchant une solution et j'ai essayé cela sur un coup de tête. A travaillé pour mes fins.

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

Le montage commence ici ....

Cela fonctionne aussi.

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

Pour quiconque m'a marqué, c'est bien, mais comme je suis manifestement nouveau dans ce domaine, vous pourriez peut-être éclaircir ce qui n'allait pas avec la réponse.
Scottieie

Il n'y a rien de mal à votre réponse, à part que ce n'est pas un oneliner .. c'était juste un utilisateur SO hostile n'ayant pas le courage de justifier sa colère.
count0

Merci @ count0. En fait, il est significatif d'avoir des points de mana ou quoi que ce soit pour commenter une question, quelque chose que je n'ai pas encore pu faire. Dans certains cas, des questions de suivi seraient utiles car j'apprends une nouvelle compétence. Encore. TY.
Scottieie

1
nous devons donner à toutes les colonnes un nom pour l'utiliser.
Arpit Sisodia

de quel paquet renameprovient la fonction?
Diego

3

Si vous savez que votre dataframe n'a qu'une seule colonne, vous pouvez utiliser: names(trSamp) <- "newname2"


3

Vous pouvez également essayer «upData» du package «Hmisc».

library(Hmisc)

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


Très agréable! Il est également possible de renommer plusieurs colonnes à la fois: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

On a bel et bien répondu à la question du PO. Cependant, voici une astuce qui peut être utile dans certaines situations: correspondance partielle du nom de la colonne, quelle que soit sa position dans une trame 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

Ce sont des exemples que j'ai dû traiter aujourd'hui, je pensais que cela valait la peine d'être partagé.



0

Nous pouvons utiliser rename_withpour renommer les colonnes avec une fonction (stringr fonctions, par exemple).

Tenez compte des données suivantes df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Renommez toutes les variables avec dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Renommer par particule nom avec des dplyrverbes ( starts_with, ends_with, contains,matches , ...).

Exemple avec .( xvariables):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Renommer par classe avec de nombreuses fonctions de test de classe, comme is.integer, is.numeric, is.factor...

Exemple avec is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

L'avertissement:

Messages d'avertissement: 1: dans stri_replace_first_regex (chaîne, modèle, fix_replacement (remplacement),: la longueur d'objet plus longue n'est pas un multiple de la longueur d'objet plus courte 2: dans les noms [cols] <- .fn (noms [cols], ...) : le nombre d'articles à remplacer n'est pas un multiple de la longueur de remplacement

Il n'est pas pertinent, car il s'agit simplement d'une incohérence seq_along(.)avec la fonction de remplacement.


-1

J'ajouterais simplement une nouvelle colonne au bloc de données avec le nom que je veux et j'obtiendrais les données pour cela à partir de la colonne existante. comme ça:

dataf$value=dataf$Article1Order

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

dataf$Article1Order<-NULL

Ce code peut sembler idiot! Mais ça marche parfaitement ...


-1

Je changerais simplement un nom de colonne en ensemble de données avec le nouveau nom que je veux avec le code suivant: names (dataset) [index_value] <- "new_col_name"


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.