400 votes

Comment renommer une seule colonne dans un data.frame ?

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

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

pour renommer les colonnes. Comment faire s'il s'agit d'une seule colonne ? Il s'agit d'un vecteur ou d'un cadre de données qui ne contient qu'une seule colonne.

Ejemplo:

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 votes

La solution de @aix fonctionnera pour un data.frame à une colonne. Vous êtes probablement dérouté par le drop=TRUE argument par défaut pour [ ce qui fait qu'un objet "à 1 colonne" est converti en vecteur... et les vecteurs n'ont pas d'attributs. colnames . Un exemple de ce que vous avez essayé serait très utile.

3 votes

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

677voto

user2371441 Points 661

Il s'agit d'une méthode généralisée qui permet de ne pas avoir à se 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 dans le df
  2. [names(df) == old.var.name] extrait le nom de la variable que vous voulez vérifier
  3. <- 'new.var.name' attribue le nouveau nom de variable.

5 votes

Je suis également assez novice avec R, j'ai adoré cette solution ! J'ai en fait vérifié ce qu'elle fait, et je pense qu'il est bon de préciser que [names(df) == old.var.name] renvoie en fait un vecteur avec des valeurs vrai/faux. Il est donc possible de modifier les noms de plusieurs colonnes si, par exemple, des expressions régulières sont utilisées.

3 votes

Pour les résultats d'une expression régulière, utilisez quelque chose comme names(df) = sub('pattern', 'replacement', names(df)) . Sinon, vous essayeriez de définir plusieurs colonnes avec le même nom.

54 votes

Sentiments mitigés... dans un monde parfait, où les langages de programmation parfaits abondent, faudrait-il vraiment autant de frappes pour changer le nom d'une seule colonne ? J'aime R mais parfois j'ai envie de l'étrangler pour ce genre de raisons.

417voto

Joshua Ulrich Points 68776
colnames(trSamp)[2] <- "newname2"

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

colnames(trSamp) <- "newname2"

1 votes

@JoshuaUlrich - Ceci 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 Y en utilisant testData[379] <- "Y" .

101voto

zongshiwujie Points 84
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

3 votes

J'aime cette solution car vous pouvez faire référence au nom de la colonne par son nom, au lieu de devoir savoir de quelle colonne de chiffres il s'agit. C'est mieux pour les caractéristiques des grands nombres.

1 votes

J'ai une petite extension à la question et à cette réponse. J'ai un cadre de données dont la colonne contient les lettres suivantes "snp dans celui-ci. Je veux le renommer en Marqueur . Mais je veux utiliser un expression régulière pour le faire. Apparemment, le code que j'ai est défectueux : colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTI‌​ON)=="^snp$"] <- "Marker" car la colonne n'est pas renommée. Si je fais names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="‌​snp"] <- "Marker" il est renommé. Qu'est-ce que je rate ?

84voto

Ricardo Saporta Points 22951

Il s'agit d'une vieille question, mais il est intéressant de noter que vous pouvez maintenant utiliser setnames de la data.table paquet.

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 votes

Ou setNames de la base R.

60voto

alexplanation Points 433

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

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

9 votes

rename est maintenant une fonction dans le dplyr également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X