web-dev-qa-db-fra.com

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

J'ai un bloc de données appelé "newprice" (voir ci-dessous) et je veux changer les noms des colonnes dans mon programme dans 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 car je veux que chaque nom de colonne soit différent, comme vous le voyez.

Lorsque je colle mon programme dans la console R, voici le résultat 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 fonction c(), par exemple c("premium"), au lieu de la fonction paste(), mais en vain.

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

327
Son

Utilisez la fonction colnames():

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 créer un sous-ensemble:

R> colnames(X)[2] <- "superduper"
513

J'utilise ceci:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
137
Matheus Abreu

L'erreur est causée par les "guillemets intelligents" (ou ce qu'ils s'appellent). La leçon à tirer est la suivante: "n'écrivez pas votre code dans un" éditeur "qui convertit des citations en citations intelligentes".

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

De plus, vous n'avez pas besoin de paste("premium") (l'appel de paste est redondant) et il est judicieux de mettre des espaces autour de <- pour éviter toute confusion (par exemple, x <- -10; if(x<-3) "hi" else "bye"; x).

71
Joshua Ulrich

Avez-vous juste essayé

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

?

43
Jamie

La nouvelle méthode recommandée consiste à utiliser la fonction setNames. Voir ?setNames. Comme cela crée une nouvelle copie du data.frame, veillez à attribuer le résultat au data.frame original, si tel est votre intention.

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

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

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

setnames(data_table, "old-name", "new-name")
33
Scott C Wilson

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

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

En bref, ce code a les effets suivants:

names(data) examine tous les noms du cadre de données (data)

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

29

Similaire aux autres:

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

Assez simple et facile à modifier.

15
Adam Erickson

Si vous devez renommer plusieurs colonnes à la fois lorsque vous ne connaissez que les anciens noms de colonne, vous pouvez utiliser la fonction colnames et l'opérateur %in%. 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")

Cela se traduit par 

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
10
discipulus

Vous pouvez simplement faire l'édition par:

newprice <- edit(newprice)

et changez le nom de la colonne manuellement.

8
Baykal

essayer:

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

Les noms de mes colonnes sont comme ci-dessous

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

Je veux changer le nom de colonne de la classe et du sexe

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
5
Mehul Katara

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

Ne vous attendez pas à une accélération de l'opération, mais vous pouvez vous attendre à ce que la variable setnames soit plus efficace pour la consommation de mémoire car elle met à jour les noms de colonne par référence. Cela peut être suivi avec la fonction address, 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 celle-ci à la place.

5
jangorecki

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

Si nous avons 2 cadres de données, les travaux suivants

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

Nous changeons le nom de DF1 comme suit

 colnames(DF1)<- colnames(DF2)
1
Raghavan vmvs

Il y a plusieurs 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 dplyr::rename(): dplyr::rename_all() pour tous les noms de colonnes, dplyr::rename_if() pour les noms de colonnes ciblés de manière conditionnelle et dplyr::rename_at() pour certaines colonnes nommées. L'exemple suivant remplace les espaces et les points par un trait de soulignement et convertit tout en minuscule:

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 la même manière:

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
1
sbha

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

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
0
Sophanna

Vous auriez tout de suite pu faire 

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

La commande coller que vous utilisez prend au moins 2 arguments. Cela fonctionne comme une fonction de concaténation dans Excel, c’est pourquoi il vous donne une erreur, je pense.

0
Aayush Agrawal

Obtenir les données avec les colonnes sélectionnées

get.the.df <- read_Excel("df.xls") %>%    
          select("X1","X2","X3");names(get.the.df)

changer le nom des colonnes de get.the.df colnames(get.the.df) <- c("X22","X11","X33");names(get.the.df)

0
Seyma Kalay