วิธีการเปลี่ยนชื่อคอลัมน์เดียวใน data.frame?


335

ฉันรู้ว่าฉันมีกรอบข้อมูลที่มีมากกว่า 1 คอลัมน์ฉันสามารถใช้

colnames(x) <- c("col1","col2")

เพื่อเปลี่ยนชื่อคอลัมน์ ฉันจะทำเช่นนี้ได้อย่างไรหากเป็นเพียงหนึ่งคอลัมน์ ความหมายเวกเตอร์หรือกรอบข้อมูลที่มีเพียงหนึ่งคอลัมน์ในนั้น

ตัวอย่าง:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]

4
โซลูชันของ @ aix จะทำงานกับ data.frame 1 คอลัมน์ คุณอาจถูกสับสนโดยdrop=TRUEอาร์กิวเมนต์เริ่มต้น[ซึ่งทำให้เกิดเป็น "1 คอลัมน์" วัตถุจะถูกแปลงเป็นเวกเตอร์เวกเตอร์ ... colnamesและไม่ได้มี ตัวอย่างของสิ่งที่คุณพยายามจะมีประโยชน์มาก
Joshua Ulrich

2
มันจะทำงานได้ถ้าคุณใช้ "colnames (x) [1] <- 'newname2'"
screechOwl

คำตอบ:


344
colnames(trSamp)[2] <- "newname2"

พยายามตั้งชื่อคอลัมน์ที่สอง วัตถุของคุณมีเพียงหนึ่งคอลัมน์ดังนั้นคำสั่งจะส่งข้อผิดพลาด นี่ควรจะเพียงพอ:

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - นี้ดูเหมือนจะไม่ทำงานถ้าชื่อคอลัมน์ที่เป็นสิ่งที่ชอบ"A,B,C,X,Y,Z"ที่ฉันต้องการที่จะเปลี่ยนชื่อไปใช้Y testData[379] <- "Y"
Chetan Arvind Patil

576

นี่เป็นวิธีทั่วไปที่คุณไม่จำตำแหน่งที่แน่นอนของตัวแปร:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

รหัสนี้สวยมากทำต่อไปนี้:

  1. names(df) มองหาชื่อทั้งหมดใน df
  2. [names(df) == old.var.name] แยกชื่อตัวแปรที่คุณต้องการตรวจสอบ
  3. <- 'new.var.name' กำหนดชื่อตัวแปรใหม่

5
ฉันค่อนข้างใหม่กับ R ชอบวิธีนี้มาก! ฉันได้ตรวจสอบสิ่งที่มันทำและฉันคิดว่ามันคุ้มค่าที่ระบุว่า[names(df) == old.var.name]จริง ๆ แล้วคืนค่าเวกเตอร์ด้วยค่าจริง / เท็จ ดังนั้นจึงมีความเป็นไปได้ที่จะเปลี่ยนชื่อคอลัมน์หลาย ๆ ตัวอย่างเช่นหากใช้นิพจน์ทั่วไป
mikyatope

3
names(df) = sub('pattern', 'replacement', names(df))เพื่อให้ได้ผลลัพธ์แสดงออกปกติใช้สิ่งที่ต้องการ มิฉะนั้นคุณจะพยายามตั้งหลายคอลัมน์เป็นชื่อเดียวกัน
พวกเราทุกคนโมนิก้า

40
ความรู้สึกที่หลากหลาย ... ในโลกที่สมบูรณ์แบบซึ่งภาษาการเขียนโปรแกรมที่สมบูรณ์แบบนั้นจะต้องใช้การกดแป้นจำนวนมากเพื่อเปลี่ยนชื่อของคอลัมน์เดียวหรือไม่? ฉันรัก R แต่บางครั้งฉันต้องการบีบคอด้วยเหตุผลเหล่านี้
tumultous_rooster

4
วิธีไม่มีฟังก์ชั่น wrapper สำหรับเรื่องนี้ในฐาน?
ifly6

1
เราทุกคนปรารถนา! ฉันไม่ทราบเกี่ยวกับตอนนี้ แต่กลับมาแล้วไม่มีเสื้อคลุมในฐาน
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
ฉันชอบวิธีนี้เนื่องจากคุณสามารถอ้างอิงชื่อคอลัมน์ตามชื่อได้ซึ่งต่างกับการกำหนดให้รู้ว่าเป็นคอลัมน์ตัวเลขใด ดีกว่าสำหรับฟีเจอร์ตัวเลขที่มากขึ้น
Cybernetic

1
ฉันมีคำถามเพิ่มเติมเล็กน้อยและคำตอบนี้ ฉันมี dataframe พร้อมคอลัมน์ซึ่งมีตัวอักษร'snp'อยู่ในนั้น ฉันต้องการที่จะเปลี่ยนชื่อเป็น'เครื่องหมาย' แต่ฉันต้องการใช้นิพจน์ทั่วไปเพื่อทำเช่นนั้น เห็นได้ชัดว่ารหัสฉันมีข้อบกพร่อง: colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"เนื่องจากคอลัมน์ไม่ได้เปลี่ยนชื่อ ถ้าฉันทำnames(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"มันถูกเปลี่ยนชื่อ ฉันพลาดอะไรไป
Sander W. van der Laan

76

นี่เป็นคำถามเก่า แต่น่าสังเกตว่าตอนนี้คุณสามารถใช้setnamesจากdata.tableแพ็คเกจได้แล้ว

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
หรือsetNamesจากฐานอาร์
PatrickT

53

สิ่งนี้สามารถทำได้โดยใช้plyrแพ็คเกจของ Hadley และrenameฟังก์ชั่น

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

คุณสามารถเปลี่ยนชื่อด้วยชื่อ (โดยไม่ทราบตำแหน่ง) และทำการเปลี่ยนชื่อหลายรายการพร้อมกัน หลังจากทำการผสานตัวอย่างเช่นคุณอาจท้ายด้วย:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

ซึ่งคุณสามารถเปลี่ยนชื่อได้ในขั้นตอนเดียวโดยใช้:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13

7
renameตอนนี้เป็นฟังก์ชั่นในdplyrแพ็คเกจเช่นกัน
Sam Firke

36

ฉันคิดว่าวิธีที่ดีที่สุดในการเปลี่ยนชื่อคอลัมน์คือการใช้แพ็คเกจdplyrดังนี้:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

มันทำงานเหมือนกันสำหรับการเปลี่ยนชื่อหนึ่งหรือหลายคอลัมน์ในชุดข้อมูลใด ๆ


12

ฉันชอบสไตล์ถัดไปสำหรับเปลี่ยนชื่อคอลัมน์ชื่อไฟล์แบบหนึ่งต่อหนึ่ง

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

ที่ไหน

which(colnames(df) == 'old_colname')

ส่งคืนโดยดัชนีของคอลัมน์ที่เฉพาะเจาะจง


1
+1 สำหรับให้ผู้ใช้มีโอกาสใช้ชื่อเก่าจริง :)

1
อะไรคือความแตกต่างเมื่อเทียบกับโซลูชันของ @zongshiwujie
buhtz

which()ไม่จำเป็น.
sindri_baldur

12

ฉันพบว่าวิธีที่สะดวกที่สุดในการเปลี่ยนชื่อคอลัมน์เดียวคือdplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • ทำงานได้ดีในห่วงโซ่ท่อ
  • สะดวกเมื่อเก็บชื่อไว้ในตัวแปร
  • ทำงานร่วมกับชื่อหรือดัชนีคอลัมน์
  • ชัดเจนและกะทัดรัด

6

คุณสามารถใช้rename.varsในgdataแพ็คเกจ

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณมีชื่อตัวแปรมากกว่าหนึ่งชื่อที่จะเปลี่ยนหรือคุณต้องการผนวกหรือเติมข้อความบางส่วนให้กับชื่อตัวแปรล่วงหน้าจากนั้นคุณสามารถทำสิ่งต่อไปนี้

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

สำหรับตัวอย่างของการต่อท้ายข้อความไปยังชุดย่อยของชื่อตัวแปรโปรดดู: https://stackoverflow.com/a/28870000/180892


นี่เป็นวิธีที่ง่ายที่สุดขอบคุณ มีปัญหากับแพคเกจ dplyr
DannyB

4

ลอง:

colnames(x)[2] <- 'newname2'

8
นี่คือสิ่งที่ทำให้เกิดข้อผิดพลาดที่ OP ถามเกี่ยวกับ (ในการแก้ไขของเขา) มันจะไม่ทำงานเนื่องจาก dataframe มีเพียงหนึ่งคอลัมน์

. @ NPE - นี้ดูเหมือนจะไม่ทำงานถ้าชื่อคอลัมน์ที่เป็นสิ่งที่ชอบ"A,B,C,X,Y,Z"ที่ฉันต้องการที่จะเปลี่ยนชื่อไปใช้Y testData[379] <- "Y"
Chetan Arvind Patil

4

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

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

แก้ไขเริ่มต้นที่นี่ ....

ใช้งานได้ดีเช่นกัน

df <- rename(df, c("oldColName" = "newColName"))

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

ไม่มีอะไรผิดปกติกับคำตอบของคุณนอกจากนั้นไม่ใช่การเป็นผู้ออกคำสั่ง .. นั่นเป็นเพียงผู้ใช้ที่ไม่เป็นมิตรดังนั้นผู้ที่ไม่มีความกล้าที่จะพิสูจน์ความโกรธเคืองของเขา
count0

ขอบคุณ @ count0 ที่จริงแล้วมันมีความหมายที่จะมีคะแนนมานะหรืออะไรก็ตามที่แสดงความคิดเห็นต่อคำถามสิ่งที่ฉันยังไม่สามารถทำได้ ติดตามคำถามในบางกรณีจะดีเพราะฉันเรียนรู้ชุดทักษะใหม่ อีกครั้ง TY
Scottieie

1
เราจำเป็นต้องให้ชื่อคอลัมน์ทั้งหมดเพื่อใช้สิ่งนี้
Arpit Sisodia

renameฟังก์ชั่นนี้มาจากแพ็คเกจอะไร?
Diego

3

หากคุณรู้ว่าชื่อไฟล์ของคุณมีเพียงหนึ่งคอลัมน์คุณสามารถใช้: names(trSamp) <- "newname2"


3

คุณสามารถลอง 'upData' จากแพ็คเกจ 'Hmisc'

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))


ดีมาก! มันยังเป็นไปได้ที่จะเปลี่ยนชื่อคอลัมน์อื่น ๆ ในครั้งเดียว: trSamp = Updata (. trSamp เปลี่ยนชื่อ c = (sample.trainer.index..10000 = 'newname2, AnotherColumnName = 'RenameThisColumn'))
FraNut

0

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

การจับคู่บางส่วนกับชื่อ:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

อีกตัวอย่าง: การจับคู่บางส่วนกับ "เครื่องหมายวรรคตอน":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

เหล่านี้เป็นตัวอย่างที่ฉันต้องจัดการกับวันนี้ฉันคิดว่าอาจเป็นการแบ่งปันที่คุ้มค่า


0

ฉันพบการcolnames()โต้แย้งง่ายขึ้น https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

เลือกคอลัมน์จากกรอบข้อมูล

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])

และเปลี่ยนชื่อคอลัมน์ที่เลือกตามลำดับ

colnames(df) <- c("hhid", "income", "cost", "credit")

ตรวจสอบชื่อและค่าต่าง ๆ เพื่อให้แน่ใจ

names(df);head(df)

0

เราสามารถใช้rename_withเพื่อเปลี่ยนชื่อคอลัมน์ด้วยฟังก์ชั่น ( stringrฟังก์ชั่นเช่น)

พิจารณาข้อมูลต่อไปนี้df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

เปลี่ยนชื่อตัวแปรทั้งหมดด้วยdplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

เปลี่ยนชื่อโดยอนุภาคชื่อกับบางdplyrคำกริยา ( starts_with, ends_with, contains, matches, ... )

ตัวอย่างด้วย.( xตัวแปร):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

เปลี่ยนชื่อจากระดับที่มีฟังก์ชั่นหลายของการทดสอบระดับเช่นis.integer, is.numeric, is.factor...

ตัวอย่างด้วยis.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

คำเตือน:

ข้อความเตือน: 1: ใน stri_replace_first_regex (สตริง, รูปแบบ, fix_replacement (แทนที่),: ความยาววัตถุอีกต่อไปไม่ได้เป็นความยาวของวัตถุที่สั้นกว่าหลาย 2: ในชื่อ [cols] <- .fn (ชื่อ [cols], ... ) : จำนวนรายการที่จะเปลี่ยนไม่ได้เป็นความยาวของการเปลี่ยนหลายรายการ

ไม่เกี่ยวข้องเนื่องจากเป็นเพียงความไม่สอดคล้องseq_along(.)กับฟังก์ชันแทนที่


-1

ฉันจะเพิ่มคอลัมน์ใหม่ลงในกรอบข้อมูลด้วยชื่อที่ฉันต้องการและรับข้อมูลจากคอลัมน์ที่มีอยู่ แบบนี้:

dataf$value=dataf$Article1Order

แล้วฉันจะลบคอลัมน์เก่า! แบบนี้:

dataf$Article1Order<-NULL

รหัสนี้อาจดูงี่เง่า! แต่มันทำงานได้อย่างสมบูรณ์ ...


-1

ฉันจะเปลี่ยนชื่อคอลัมน์เป็นชุดข้อมูลด้วยชื่อใหม่ที่ฉันต้องการด้วยรหัสต่อไปนี้: names (dataset) [index_value] <- "new_col_name"


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