จะเปลี่ยนชื่อคอลัมน์ใน data frame ใน R ได้อย่างไร? [ปิด]


9
 names(mydat)[c(name)]<-c("newname") 

จากนี้ฉันรู้ว่าคอลัมน์ / ชื่อตัวแปร "ชื่อ" ของ data frame mydat จะถูกแทนที่ด้วย "newname"

คำถามของฉันคือถ้าฉันต้องการทำสิ่งนี้ด้วยการวนซ้ำเพื่อที่ฉันจะได้สิ่งที่ชอบ:

newname1 newname2 newname3 newname4 เป็นต้นฉันจะทำอย่างไร

นี่คือสิ่งที่ทำและไม่ได้ผล:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

มีวิธีการรหัสนี้หรือไม่? ขอบคุณมากสำหรับทุกคนที่สามารถช่วยได้ Owusu Isaac


4
คำถามนี้ดูเหมือนจะไม่เป็นหัวข้อเพราะเป็นเรื่องเกี่ยวกับการเขียนโปรแกรม
gung - Reinstate Monica

หากคุณต้องการเปลี่ยนชื่อตัวแปรที่น่าเกลียดบางอย่าง (เช่น abcde_1_1, abcde_2_2, abcde_3_3 ... ) เนื่องจากมันเกิดขึ้นบ่อยครั้งในชุดข้อมูลบางชุดที่ดาวน์โหลดจาก Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

คำตอบ:


10

ทางออกที่ชัดเจนที่สุดคือการเปลี่ยนรหัสของคุณในการวนซ้ำกับสิ่งต่อไปนี้:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

แต่คุณต้องชี้แจงว่าตัวแปรของคุณnameคืออะไร ในขณะนี้การวนซ้ำนี้จะทำการเปลี่ยนชื่อ 4 ครั้งของคอลัมน์เดี่ยว

โดยทั่วไปหากชื่อที่คุณต้องการเปลี่ยนนั้นเป็นแบบเวกเตอร์นี่เป็นขั้นตอนการตั้งค่ามาตรฐานย่อย:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes

สวัสดี Mpiktas โซลูชันของคุณทำงานได้อย่างยอดเยี่ยม ขอบคุณมาก. และขอขอบคุณทุกคนเช่นกัน
ลูกชาย

1
@Owusu การแสดงออกของความกตัญญูในเว็บไซต์นี้คือ upvoting ของคำตอบและการยอมรับของพวกเขา ดูคำถามที่พบบ่อย ทั้งสองวิธีดีใจที่ได้เป็นประโยชน์
mpiktas

6

ลองใช้sprintfหรือpasteเช่นนี้:

names(mydat)<-sprintf("name%d",1:10)

นอกจากนี้ให้สังเกตว่าnames(mydat)[c(name)]เรื่องไร้สาระยิ่งน้อย c(name)เทียบเท่ากับการเขียนอย่างถูกต้องnameและหมายถึง "รับค่าของตัวแปรที่เรียกว่าname'; อย่างน้อยวงเล็บจะแยกองค์ประกอบของnames(mydat)แต่ถ้าnameตัวแปรมีดัชนีเป็นตัวเลขหรือบูลีนเท่านั้น

หากคุณต้องการแทนที่คอลัมน์ที่เรียกnameด้วยname1, name2, ..., nameNใช้สิ่งนี้:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

แก้ไข: ดีถ้าคุณเพียงแค่ต้องการลบชื่อคอลัมน์ที่ซ้ำกันมีวิธีที่ง่ายยิ่งขึ้น; R มีmake.namesฟังก์ชันที่แก้ไขปัญหานี้ มันสามารถใช้เช่นนี้:

names(mydat)<-make.names(names(mydat),unique=TRUE)

แม้สั้นกว่าก็สามารถรับได้โดยการเขียน:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

@mbq, == การจับคู่บางส่วนสำหรับสตริงหรือไม่
mpiktas

@mpiktas ไม่ แต่จำเป็นต้องมีการจับคู่แบบตรงทั้งหมดที่นี่ greplจะโอเคที่จะทำงานทั่วไปมากขึ้น

@mbq ใช่ แต่ถือว่ามีหลายคอลัมน์ที่มีชื่อเดียวกัน R อนุญาตให้ทำได้ แต่ฉันพยายามหลีกเลี่ยงการใช้คุณสมบัตินี้
mpiktas

@mpiktas เห็นได้ชัดว่า OP ทำเช่นนั้นดังนั้นคำถามนี้

@mbq ขอบคุณสำหรับการชี้แจงความสับสนกับชื่อ (mydat) [c (ชื่อ)]ตั้งแต่ OP ได้เขียนฉันรู้ว่าชื่อคอลัมน์ / ตัวแปร "ชื่อ"ฉันเป็นเหมือน "ว้าวที่เป็นไปได้? และพยายามเข้าถึงชื่อด้วยชื่อ ... โง่ฉัน;) ฉันขอแนะนำให้แก้ไขคำถามด้วยความถ่อมใจได้ไหม?
steffen

5

ฉันมีปัญหาเดียวกันและฉันแก้ไขด้วยรหัสนี้:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.