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?


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"

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"

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).


52

Avez-vous essayé simplement:

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

?


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")

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.


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.


10

essayer:

names(newprice) <- c("premium", "change", "newprice")

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

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"

8

Vous pouvez simplement faire le montage en:

newprice <- edit(newprice)

et modifiez le nom de la colonne manuellement.


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")

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

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.


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'))

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)
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.