Kolomnamen van een dataframe wijzigen

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)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

fourteen − 6 =

Other episodes