การเปลี่ยนชื่อคอลัมน์ของ data frame


399

ฉันมี data frame ชื่อ "newprice" (ดูด้านล่าง) และฉันต้องการเปลี่ยนชื่อคอลัมน์ในโปรแกรมของฉันใน R

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

ในความเป็นจริงนี่คือสิ่งที่กำลังทำ:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

ฉันไม่ได้ใส่สิ่งนี้ไว้ในลูปเพราะฉันต้องการให้แต่ละชื่อคอลัมน์แตกต่างกันอย่างที่คุณเห็น

เมื่อฉันวางโปรแกรมลงในคอนโซล R นี่คือผลลัพธ์มันให้ฉัน:

> 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(“"

ฉันพยายามอย่างเท่าเทียมกันโดยใช้c()ฟังก์ชั่น - c("premium")แทนpaste()ฟังก์ชั่น แต่ไม่มีประโยชน์

มีคนช่วยฉันคิดเรื่องนี้ได้ไหม


หากคำตอบของเดิร์คนั้นทำงานได้ปัญหาก็คือคุณกำลังทำงานกับเมทริกซ์แทนที่จะใช้ดาต้าเฟรม คุณสามารถตรวจสอบเรื่องนี้ด้วยหรือis.matrix str
IRTFM

3
ดูคำตอบนี้ได้ที่ dplyr :: เปลี่ยนชื่อstackoverflow.com/a/26146202/1831980
Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
ตุงเหงียน

ข้อผิดพลาดของคุณไม่เกี่ยวข้องกับคุณภาพของรหัสของคุณ คุณแค่ใช้สัญลักษณ์ผิด “ ไม่รู้จัก R โดยใช้” แทนฉันรู้ว่าพวกมันอาจดูเหมือนกันดูใกล้:“ " แค่นั้นแหละ.
Edo

คำตอบ:


594

ใช้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

คุณยังสามารถเซ็ตย่อย:

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

12
@Dirk ทำไมไม่ใช้ชื่อ () แทนที่จะใช้ชื่อ ()
Antoine Lizée

4
ที่ดี! คุณยังสามารถย่อยหลายคอลัมน์พร้อมกันได้ (มีประโยชน์กับเฟรมข้อมูลขนาดใหญ่) colnames(X)[c(1,2)] <- c("good", "better")
metakermit

7
ลองsetnames()ในdata.tableแพ็คเกจ ใช้สิ่งที่ต้องการsetnames(DT,"b","B")หรือsetnames(DT,c("a","E"),c("A","F"))
dwstu

แปลกหลังจากตั้งค่าชื่อคอลัมน์ของ data frame q1พยายามเปลี่ยน data frame โดยใช้dplyrในq1 <- q1 %>% mutate(rel_count = count / 482462)ผลลัพธ์ของข้อผิดพลาดError in mutate_impl(.data, dots) : unknown column 'days'(ซึ่งdaysเป็นชื่อใหม่ที่กำหนดให้กับคอลัมน์) มันน่าผิดหวังจริงๆ
David Tonhofer

176

ฉันใช้สิ่งนี้:

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

7
ขอบคุณ. ฉันคิดว่ามันน่ารำคาญอย่างยิ่งกับ R: ทำไมจึงยากที่จะเปลี่ยนชื่อคอลัมน์ถ้าคุณไม่ต้องการใช้หมายเลขดัชนี แต่ชื่อเก่า :(
Arne

10
วิธีนี้มีข้อดีที่คุณไม่ต้องกังวลเกี่ยวกับตำแหน่งของคอลัมน์ตราบใดที่คุณรู้ชื่อเดิม ฉันคิดว่านี่เป็นวิธีที่คุณต้องการในภายหลัง - ทำการเปลี่ยนแปลงรหัสที่เปลี่ยนตำแหน่งของคอลัมน์ที่คุณต้องการเปลี่ยนชื่อ
Paulo S. Abreu

78

ข้อผิดพลาดเกิดจาก "คำพูดอัจฉริยะ" (หรือสิ่งที่เรียกว่า) บทเรียนที่นี่คือ "อย่าเขียนรหัสของคุณใน 'บรรณาธิการ' ที่แปลงคำพูดเป็นสมาร์ทอัญประกาศ"

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

นอกจากนี้คุณไม่จำเป็นpaste("premium")(การเรียกpasteซ้ำซ้อน) และควรวางช่องว่าง<-เพื่อหลีกเลี่ยงความสับสน (เช่นx <- -10; if(x<-3) "hi" else "bye"; x)



42

วิธีที่แนะนำใหม่ในการทำเช่นนี้คือการใช้setNamesฟังก์ชั่น ?setNamesดู เนื่องจากสิ่งนี้สร้างสำเนาใหม่ของdata.frameให้แน่ใจว่าได้กำหนดผลลัพธ์ให้กับต้นฉบับdata.frameถ้าเป็นความตั้งใจของคุณ

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

เวอร์ชั่นใหม่ของ R จะให้คำเตือนหากคุณใช้colnamesวิธีตอบข้อเสนอแนะก่อนหน้านี้ในบางวิธี

หากนี่คือ a data.tableแทนคุณสามารถใช้data.tableฟังก์ชันsetnamesซึ่งสามารถแก้ไขชื่อคอลัมน์เฉพาะหรือชื่อคอลัมน์เดียวโดยการอ้างอิง :

setnames(data_table, "old-name", "new-name")

2
คิดว่ามันถูกถามถึง data.frame ไม่ใช่ data.table
Helix123

35

ฉันมีปัญหาเดียวกันและรหัสชิ้นนี้ได้ผลสำหรับฉัน

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

กล่าวโดยย่อรหัสนี้ทำสิ่งต่อไปนี้:

names(data)ค้นหาชื่อทั้งหมดใน dataframe ( data)

[names(data) == oldVariableName]แยกชื่อตัวแปร ( oldVariableName) ที่คุณต้องการรับการเปลี่ยนชื่อและ<- "newVariableName"กำหนดชื่อตัวแปรใหม่


มันจะทำงานอย่างไรถ้าคุณมีเวกเตอร์ด้วยเช่น 3 oldVariableNames
jiggunjer

สิ่งที่ฉันกำลังมองหา -> ยกนิ้วให้ 2 นิ้ว !!
SilSur



10

หากคุณต้องการเปลี่ยนชื่อไม่ใช่ทั้งหมด แต่มีหลายคอลัมน์พร้อมกันเมื่อคุณรู้จักชื่อคอลัมน์เก่าเท่านั้นคุณสามารถใช้colnamesฟังก์ชันและ%in%โอเปอเรเตอร์ได้ ตัวอย่าง:

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

ตอนนี้คุณต้องการเปลี่ยน "ไม่ดี" และ "แย่ที่สุด" เป็น "ดี" และ "ดีที่สุด" คุณสามารถใช้ได้

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

ผลลัพธ์นี้ใน

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

1
รหัสนั้นจะถือว่าการเรียงลำดับชื่อคอลัมน์ของคุณเท่ากับการเรียงลำดับของเม็ดมีด
Hillary Sanders

10

ใช้สิ่งนี้เพื่อเปลี่ยนชื่อคอลัมน์โดยฟังก์ชั่น colname

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

8

คุณสามารถแก้ไขได้โดย:

newprice <- edit(newprice)

และเปลี่ยนชื่อคอลัมน์ด้วยตนเอง


มันใช้งานไม่ได้กับองค์ประกอบเวกเตอร์และองค์ประกอบเท่านั้นหรือ > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabond

มันใช้งานได้กับ data frame อย่างน้อย นั่นคือสิ่งที่ฉันรู้
Baykal

7

ชื่อคอลัมน์ของฉันเป็นดังนี้

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

ฉันต้องการเปลี่ยนชื่อคอลัมน์ของ Class และ Sex

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

7

มีตัวเลือกคู่กับdplyr::rename()และ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

นอกจากนี้ยังมีตัวแปรที่กำหนดขอบเขตสามแบบdplyr::rename()ได้แก่ : dplyr::rename_all()สำหรับชื่อคอลัมน์ทั้งหมด, dplyr::rename_if()สำหรับการกำหนดเป้าหมายชื่อคอลัมน์แบบมีเงื่อนไขและdplyr::rename_at()สำหรับคอลัมน์ที่เลือก ตัวอย่างต่อไปนี้จะแทนที่ช่องว่างและจุดด้วยเครื่องหมายขีดล่างและแปลงทุกอย่างเป็นตัวพิมพ์เล็ก:

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() ยังสามารถใช้ในลักษณะที่คล้ายกัน:

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

เพียงเพื่อแก้ไขและขยายคำตอบของ Scott Wilson เล็กน้อย
คุณสามารถใช้setnamesฟังก์ชัน data.table บน data.frames ได้เช่นกัน

อย่าคาดหวังว่าจะเพิ่มความเร็วในการดำเนินการ แต่คุณสามารถคาดหวังว่าsetnamesจะมีประสิทธิภาพมากขึ้นสำหรับการใช้หน่วยความจำเนื่องจากจะอัพเดตชื่อคอลัมน์โดยอ้างอิง นี้สามารถติดตามได้ด้วยaddressฟังก์ชั่นดูด้านล่าง

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)

ดังนั้นหากคุณกดปุ่ม จำกัด หน่วยความจำคุณอาจพิจารณาใช้อันนี้แทน


3

สิ่งนี้อาจมีประโยชน์:

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

ในกรณีที่เรามี 2 ดาต้าไฟล์การทำงานดังต่อไปนี้

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

เราเปลี่ยนชื่อของ DF1 ดังนี้

 colnames(DF1)<- colnames(DF2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.