Modification des noms de colonne d'un bloc de données

400

J'ai un bloc de données appelé "nouveau prix" (voir ci-dessous) et je veux changer les noms de colonnes dans mon programme en R.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

En fait, c'est ce que je fais:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Je n'ai pas mis cela en boucle parce que je veux que chaque nom de colonne soit différent comme vous le voyez.

Lorsque je colle mon programme dans la console R, c'est la sortie qu'il me donne:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

J'ai également essayé d'utiliser la c()fonction, par exemple c("premium"), au lieu de la paste()fonction, mais en vain.

Quelqu'un pourrait-il m'aider à comprendre cela?

Fils
la source
Si la réponse de Dirk fonctionne, le problème est que vous travaillez avec une matrice plutôt qu'avec une trame de données. Vous pouvez vérifier cela avec is.matrixou str.
IRTFM
3
Voir cette réponse sur dplyr :: rename stackoverflow.com/a/26146202/1831980
Rasmus Larsen
8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen
Votre erreur n'a rien à voir avec la qualité de votre code. Vous utilisez simplement le mauvais symbole. Ce "n'est pas reconnu par R, utilisez" à la place. Je sais qu'ils peuvent se ressembler. Regardez de près: "". C'est ça.
Edo

Réponses:

595

Utilisez la colnames()fonction:

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

Vous pouvez également sous-définir:

R> colnames(X)[2] <- "superduper"
Dirk Eddelbuettel
la source
12
@Dirk Pourquoi ne pas utiliser names () au lieu de colnames ()?
Antoine Lizée
4
Génial! Vous pouvez également sous-ensemble plusieurs colonnes à la fois (utile sur les trames Big Data). colnames(X)[c(1,2)] <- c("good", "better")
metakermit
7
Essayez setnames()dans le data.tablepackage. Utilisez quelque chose comme setnames(DT,"b","B")ousetnames(DT,c("a","E"),c("A","F"))
dwstu
Bizarrement, après avoir défini les noms de colonne du bloc de données q1, essayer de muter le bloc de données en utilisant dplyrcomme dans les q1 <- q1 %>% mutate(rel_count = count / 482462)résultats de l'erreur Error in mutate_impl(.data, dots) : unknown column 'days'(où daysest un nouveau nom donné à la colonne). C'est vraiment frustrant.
David Tonhofer
176

J'utilise ceci:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Matheus Abreu
la source
7
Je vous remercie. Je pense que c'est quelque peu ennuyeux avec R: Pourquoi est-il si difficile de changer le nom de la colonne si vous ne voulez pas utiliser le numéro d'index mais l'ancien nom :(
Arne
10
Cette méthode a l'avantage que vous n'avez pas à vous soucier de la position de la colonne, tant que vous connaissez son nom d'origine. Je pense que c'est la méthode préférée car vous pouvez - plus tard - apporter des modifications au code qui modifient la position de la colonne que vous souhaitez renommer.
Paulo S. Abreu,
78

L'erreur est causée par les «guillemets intelligents» (ou leur nom). La leçon ici est, "n'écrivez pas votre code dans un 'éditeur' qui convertit les citations en citations intelligentes".

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

De plus, vous n'avez pas besoin paste("premium")(l'appel à pasteest redondant) et c'est une bonne idée de mettre des espaces <-pour éviter la confusion (par exemple x <- -10; if(x<-3) "hi" else "bye"; x).

Joshua Ulrich
la source
52

Avez-vous essayé simplement:

names(newprice)[1]<-"premium"

?

Jamie
la source
42

La nouvelle façon recommandée de le faire est d'utiliser la setNamesfonction. Tu vois ?setNames. Comme cela crée une nouvelle copie de la data.frame, assurez-vous d'affecter le résultat à l'original data.frame, si telle est votre intention.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Les versions plus récentes de R vous avertiront si vous utilisez colnamesde certaines des manières suggérées par les réponses précédentes.

S'il s'agissait data.tableplutôt d' un , vous pourriez utiliser la data.tablefonction setnames, qui peut modifier des noms de colonne spécifiques ou un nom de colonne unique par référence :

setnames(data_table, "old-name", "new-name")
Scott C Wilson
la source
2
pense qu'on lui a demandé data.frame, pas data.table
Helix123
35

J'ai eu le même problème et ce morceau de code a fonctionné pour moi.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

En bref, ce code fait ce qui suit:

names(data)examine tous les noms dans le dataframe ( data)

[names(data) == oldVariableName]extrait le nom de variable ( oldVariableName) que vous souhaitez renommer et <- "newVariableName"attribue le nouveau nom de variable.

Desta Haileselassie Hagos
la source
comment cela fonctionnerait-il si vous aviez un vecteur avec par exemple 3 oldVariableNames?
jiggunjer
Exactement ce que je cherchais -> 2 pouces !!
SilSur
19

Similaire aux autres:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Assez simple et facile à modifier.

Adam Erickson
la source
10

essayer:

names(newprice) <- c("premium", "change", "newprice")
ngamita
la source
10

Si vous devez renommer non pas toutes les colonnes mais plusieurs à la fois lorsque vous ne connaissez que les anciens noms de colonne, vous pouvez utiliser la colnamesfonction et l' %in%opérateur. Exemple:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Maintenant, vous voulez changer "mauvais" et "pire" en "bon" et "meilleur". Vous pouvez utiliser

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Il en résulte

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
discipulus
la source
1
Ce code suppose que l'ordre des noms de vos colonnes est égal à celui des insertions
Hillary Sanders
10

Utilisez-le pour modifier le nom de la colonne par la fonction colname.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
Sophanna
la source
8

Vous pouvez simplement faire le montage en:

newprice <- edit(newprice)

et modifiez le nom de la colonne manuellement.

Baykal
la source
Cela ne fonctionne-t-il pas uniquement pour les éléments vectoriels et factoriels? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond
Cela fonctionne pour les trames de données au moins. Voilà ce que je sais.
Baykal
7

Les noms de mes colonnes sont comme ci-dessous

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Je souhaite modifier le nom de la colonne Classe et sexe

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Mehul Katara
la source
7

Il y a quelques options avec dplyr::rename()et dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

Il existe également trois variantes de portée dplyr::rename(): dplyr::rename_all()pour tous les noms de colonne, dplyr::rename_if()pour le ciblage conditionnel des noms de colonne et dplyr::rename_at()pour sélectionner les colonnes nommées. L'exemple suivant remplace les espaces et les points par un trait de soulignement et convertit tout en minuscules:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() peut également être utilisé de manière similaire:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
sbha
la source
6

Juste pour corriger et étendre légèrement la réponse de Scott Wilson.
Vous pouvez également utiliser la setnamesfonction de data.table sur data.frames.

Ne vous attendez pas à une accélération de l'opération, mais vous pouvez vous attendre à ce setnamesqu'il soit plus efficace pour la consommation de mémoire car il met à jour les noms de colonne par référence. Cela peut être suivi avec la addressfonction, voir ci-dessous.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Donc, si vous atteignez vos limites de mémoire, vous pouvez envisager d'utiliser celui-ci à la place.

jangorecki
la source
3

Cela peut être utile:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))
Chris
la source
1

Au cas où nous aurions 2 cadres de données, les travaux suivants

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

Nous changeons les noms de DF1 comme suit

 colnames(DF1)<- colnames(DF2)
Raghavan vmvs
la source