วิธีที่มีประสิทธิภาพมากที่สุดในการเปลี่ยนชื่อคอลัมน์ใน data.table คืออะไร?

บางครั้งก่อนที่จะรวม จะมีประโยชน์ที่จะเปลี่ยนชื่อคอลัมน์เพื่อความสอดคล้องกัน เมื่อทำงานกับ data.frame สิ่งนี้ค่อนข้างตรงไปตรงมา (ตามที่ระบุไว้ที่นี่); แม้ว่าโซลูชันเดียวกันนี้จะใช้ได้กับ ``data.table` แต่ก็ส่งคำเตือนออกมา ตัวอย่างเช่น,

ran <- rep(34,50)
dom <- rep("cat",50)
table <- rep("pig", 50)

DT <- data.table(ran,dom,table); head(DT)
   ran dom table
1:  34 cat   pig
2:  34 cat   pig
3:  34 cat   pig
4:  34 cat   pig
5:  34 cat   pig
6:  34 cat   pig

##the data.frame way

names(DT) <- toupper(names(DT))

##the error 
Warning message:
In `names<-.data.table`(`*tmp*`, value = c("RAN", "DOM", "TABLE" :
  The names(x)<-value syntax copies the whole table. This is due to <- in R 
 itself. Please change to setnames(x,old,new) which does not copy and is faster. 
 See help('setnames'). You can safely ignore this warning if it is inconvenient 
 to change right now. Setting options(warn=2) turns this warning into an error, 
 so you can then use traceback() to find and change your names<- calls.

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

##the work around
upper <- toupper(names(DT))

setnames(DT,upper);head(DT)

   RAN DOM TABLE
1:  34 cat   pig
2:  34 cat   pig
3:  34 cat   pig
4:  34 cat   pig
5:  34 cat   pig
6:  34 cat   pig

person kpeyton    schedule 10.05.2013    source แหล่งที่มา
comment
setnames เป็นฟังก์ชันจากแพ็คเกจ data.table และตามคำเตือนระบุว่า นี่เป็นวิธีที่ต้องการในการทำสิ่งต่างๆ   -  person James    schedule 10.05.2013
comment
คุณกำลังขออะไรมากไปกว่าการกระชับวิธีแก้ปัญหาของคุณให้เป็นเช่น setnames(DT,toupper(names(DT))) หรือไม่?   -  person Carl Witthoft    schedule 10.05.2013
comment
ฉันไม่รู้ว่าคุณได้แก้ไขคำถามของคุณหรือไม่...อย่างไรก็ตาม ตามที่ความคิดเห็นก่อนหน้านี้กล่าวไว้แล้ว setnames ไม่ใช่ วิธีแก้ปัญหาอย่างที่คุณพูด แต่เป็นวิธี data.table ที่จะทำ ดังนั้นคุณก็สามารถโพสต์สิ่งนั้นเป็นคำตอบและยอมรับได้   -  person Christoph_J    schedule 10.05.2013
comment
เพื่อให้ชัดเจน ข้อความเตือนใน R ไม่ใช่ข้อผิดพลาด เว้นแต่คุณจะเลื่อนระดับให้เป็นข้อผิดพลาดใน options() อย่างชัดเจน [โดยปกติสำหรับวัตถุประสงค์ในการแก้ไขจุดบกพร่อง] ดังที่ระบุไว้ในข้อความเตือนที่เป็นประโยชน์ หากคุณตรวจสอบ str(DT) หลังจากการเรียก toupper() คุณจะพบว่ามี DT อยู่ - คงไม่มีข้อผิดพลาดเกิดขึ้นจากการเรียก toupper()   -  person Dennis    schedule 11.05.2013
comment
ขอบคุณสำหรับคำตอบ ฉันแค่อยากจะรู้ว่ามีไวยากรณ์ที่เหมาะสมในการส่งผ่านการดำเนินการไปที่ data.table มากกว่าสิ่งที่ฉันทำซึ่ง @Matthew ได้ตอบไว้หรือไม่ ดังที่กล่าวไว้ในโพสต์ของฉัน คุณสามารถใช้ไวยากรณ์เดียวกันกับที่คุณใช้ใน data.frame และถึงแม้ว่ามันจะแสดงข้อความเตือน แต่มันก็ยังคงใช้งานได้ ฉันเดาว่า 'ข้อผิดพลาด' เป็นตัวเลือกคำที่ผิด ดังนั้นขออภัยสำหรับความสับสนที่นั่น ดูเหมือนว่า 'การแก้ไข' ของฉันเป็นวิธีที่เหมาะสมที่จะทำ ซึ่งเป็นสิ่งที่ฉันอยากรู้ สำหรับบันทึกแม้ว่าวิธี data.frame ใช้งานได้ แต่วิธี data.table นั้นเร็วกว่ามาก   -  person kpeyton    schedule 12.05.2013
comment
@kpeyton. ดีที่ได้ยิน. ในความเป็นจริง setnames ควรเร็วขึ้น (เกือบ) ไม่สิ้นสุด เนื่องจากแม้แต่ตารางที่มีขนาดใหญ่มากก็ควรใช้เวลา (เกือบ) คงที่ 0.00 วินาที วิธี data.frame จะคัดลอกทั้งตาราง เพียงเพื่อเปลี่ยนชื่อ แม้แต่สำเนาเดียวก็อาจมีนัยสำคัญและอาจหมายความว่าคุณได้รับข้อผิดพลาด 'หน่วยความจำไม่เพียงพอ' ที่น่าสะพรึงกลัว   -  person Matt Dowle    schedule 12.05.2013


คำตอบ (1)


เพื่อให้คำตอบนี้ ดังที่ความคิดเห็นกล่าวไว้ setnames เป็นฟังก์ชัน data.table และเป็นวิธีที่ data.table แนะนำอยู่แล้ว (ตามคำเตือนอันยาวนานจาก data.table แนะนำ) เช่น.,

setnames(DT,toupper(names(DT)))

อย่าสับสนกับฟังก์ชัน setNames จากแพ็คเกจ stats! (หมายเหตุตัวพิมพ์ใหญ่ N)

person Matt Dowle    schedule 11.05.2013