Ik heb een dataframe met de naam “newprice” (zie hieronder) en ik wil de kolomnamen in mijn programma in R wijzigen.
> newprice
Chang. Chang. Chang.
1 100 36 136
2 120 -33 87
3 150 14 164
In feite is dit wat ik doe:
names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice")
Ik heb dit niet in een lus geplaatst omdat ik wil dat elke kolomnaam anders is, zoals je ziet.
Als ik mijn programma in de R-console plak, krijg ik dit als uitvoer:
> 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(“"
Ik heb ook geprobeerd de functie c()
te gebruiken, bijvoorbeeld c("premium")
, in plaats van de paste()
functie, maar het mocht niet baten.
Kan iemand me helpen dit uit te zoeken?
Antwoord 1, autoriteit 100%
Gebruik de functie 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
Je kunt ook subsets maken:
R> colnames(X)[2] <- "superduper"
Antwoord 2, autoriteit 31%
Ik gebruik dit:
colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Antwoord 3, autoriteit 13%
De fout wordt veroorzaakt door de “slimme aanhalingstekens” (of hoe ze ook heten). De les hier is: “schrijf je code niet in een ‘editor’ die aanhalingstekens omzet in slimme aanhalingstekens”.
names(newprice)[1]<-paste(“premium”) # error
names(newprice)[1]<-paste("premium") # works
Je hebt ook geen paste("premium")
nodig (de aanroep om paste
is overbodig) en het is een goed idee om spaties rond <-
om verwarring te voorkomen (bijv. x <- -10; if(x<-3) "hi" else "bye"; x
).
Antwoord 4, autoriteit 11%
Probeer:
names(newprice)[1] <- "premium"
Antwoord 5, autoriteit 8%
De nieuwe aanbevolen manier om dit te doen, is door de functie setnames
te gebruiken. Zien
?setNames
. Aangezien hierdoor een nieuwe kopie van het data.frame
wordt gemaakt, moet u het resultaat toewijzen aan het originele data.frame
, als dat uw bedoeling is.
data_frame <- setNames(data_frame, c("premium","change","newprice"))
Nieuwere versies van R geven een waarschuwing als je colnames
gebruikt op een van de manieren die in eerdere antwoorden zijn gesuggereerd.
Als dit in plaats daarvan een data.table
was, zou u de functie data.table
setnames
kunnen gebruiken, die specifieke kolomnamen of een enkele kolomnaam door verwijzing:
setnames(data_table, "old-name", "new-name")
Antwoord 6, autoriteit 7%
Ik had hetzelfde probleem en dit stukje code werkte voor mij.
names(data)[names(data) == "oldVariableName"] <- "newVariableName"
Kortom, deze code doet het volgende:
names(data)
kijkt naar alle namen in het dataframe (data
)
[names(data) == oldVariableName]
extraheert de variabelenaam (oldVariableName
) die u wilt hernoemen en <- "newVariableName"
wijst de nieuwe variabelenaam toe.
Antwoord 7, autoriteit 4%
Vergelijkbaar met de anderen:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Heel eenvoudig en gemakkelijk aan te passen.
Antwoord 8, autoriteit 3%
Gebruik dit om de kolomnaam te wijzigen per colnaamfunctie.
colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
Antwoord 9, autoriteit 2%
Als u niet alle kolommen maar meerdere kolommen tegelijk wilt hernoemen als u alleen de oude kolomnamen kent, kunt u de functie colnames
en de operator %in%
gebruiken. Voorbeeld:
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
Nu wil je ‘slecht’ en ‘slechtst’ wijzigen in ‘goed’ en ‘best’. U kunt
. gebruiken
colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")
Dit resulteert in
good worse best
1 1 -0.6010363 A
2 2 0.7336155 B
3 3 0.9435469 C
Antwoord 10, autoriteit 2%
Er zijn een paar opties met dplyr::rename()
en 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
Er zijn ook drie scoped varianten van dplyr::rename()
: dplyr::rename_all()
voor alle kolomnamen, dplyr::rename_if()
voor het voorwaardelijk targeten van kolomnamen en dplyr::rename_at()
voor geselecteerde benoemde kolommen. In het volgende voorbeeld worden spaties en punten vervangen door een onderstrepingsteken en wordt alles omgezet in kleine letters:
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()
kan ook op een vergelijkbare manier worden gebruikt:
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
Antwoord 11, autoriteit 2%
probeer:
names(newprice) <- c("premium", "change", "newprice")
Antwoord 12, autoriteit 2%
Mijn kolomnamen zijn zoals hieronder
colnames(t)
[1] "Class" "Sex" "Age" "Survived" "Freq"
Ik wil de kolomnaam van klasse en geslacht wijzigen
colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Antwoord 13
Je kunt de bewerking gewoon doen door:
newprice <- edit(newprice)
en wijzig de kolomnaam handmatig.
Antwoord 14
Gewoon om het antwoord van Scott Wilson te corrigeren en iets uit te breiden.
U kunt de functie setnames
van data.table ook op data.frames gebruiken.
Verwacht geen snelheid van de bewerking, maar je kunt verwachten dat de setnames
efficiënter zijn voor het geheugenverbruik, omdat het kolomnamen door middel van referentie bijwerkt. Dit kan worden gevolgd met de functie address
, zie hieronder.
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)
Dus als je je geheugenlimiet bereikt, kun je overwegen deze te gebruiken.
Antwoord 15
Dit kan nuttig zijn:
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'))
Antwoord 16
In het geval dat we 2 dataframes hebben, werkt het volgende
DF1<-data.frame('a', 'b')
DF2<-data.frame('c','d')
We veranderen de namen van DF1 als volgt
colnames(DF1)<- colnames(DF2)