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?
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"
J'utilise ceci:
colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
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
).
Avez-vous juste essayé
names(newprice)[1]<-"premium"
?
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")
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.
Similaire aux autres:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Assez simple et facile à modifier.
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
Vous pouvez simplement faire l'édition par:
newprice <- edit(newprice)
et changez le nom de la colonne manuellement.
essayer:
names(newprice) <- c("premium", "change", "newprice")
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")
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.
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'))
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)
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
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"
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.
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)