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