วิธีจัดลำดับคอลัมน์ data.table ใหม่ (โดยไม่ต้องคัดลอก)


118

ฉันต้องการเรียงลำดับคอลัมน์ในของฉันdata.table xโดยให้เวกเตอร์อักขระของชื่อคอลัมน์neworder:

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")

เห็นได้ชัดว่าฉันทำได้:

x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
#            c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3

แต่จะต้องมีการคัดลอกชุดข้อมูลทั้งหมดอีกครั้ง มีวิธีอื่นในการทำเช่นนี้หรือไม่?

คำตอบ:


183

ใช้setcolorder():

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
x
#      a b         c
# [1,] 1 3 0.2880365
# [2,] 2 2 0.7785115
# [3,] 3 1 0.3297416
setcolorder(x, c("c", "b", "a"))
x
#              c b a
# [1,] 0.2880365 3 1
# [2,] 0.7785115 2 2
# [3,] 0.3297416 1 3

จาก?setcolorder:

ในdata.tableสำนวนset*ฟังก์ชั่นทั้งหมดเปลี่ยนข้อมูลที่ป้อนโดยการอ้างอิง นั่นคือไม่มีการทำสำเนาใด ๆ เลยนอกจากหน่วยความจำที่ใช้งานได้ชั่วคราวซึ่งมีขนาดใหญ่เท่ากับหนึ่งคอลัมน์

ดังนั้นควรมีประสิทธิภาพมาก ดู?setcolorderรายละเอียด


21
การชี้แจงเล็กน้อย: setcolorderย้ายตัวชี้คอลัมน์ไปรอบ ๆ โดยไม่ต้องใช้หน่วยความจำในการทำงานเลย ประโยคที่เกี่ยวกับการใช้หน่วยความจำในการทำงานที่มีขนาดใหญ่เท่ากับหนึ่งคอลัมน์นั้นเป็นเรื่องsetkeyจริง
Matt Dowle

2
@MatthewDowle - ขอบคุณสำหรับคำชี้แจง ฉันคิดว่าอาจเป็นเช่นนั้น แต่ก็ไม่แน่ใจ 100%
Chase

3
ฉันจะทำแบบนั้นกับคอลัมน์ย่อยได้ไหม ตัวอย่างเช่นเมื่อฉันต้องการย้ายไปที่คอลัมน์ด้านหน้า?
Peter Pan

5
setcolorder(df, c("someCol",colnames(dt)[!(colnames(dt) %in% c("someCol"))]))
hedgedandlevered

6
@PeterPan ดูข่าวเกี่ยวกับ devel เวอร์ชัน 1.10.5 : " setcolorder()ตอนนี้รับน้อยกว่าncol(DT)คอลัมน์ที่จะย้ายไปด้านหน้า"
Henrik

12

อาจพบว่าการใช้วิธีแก้ปัญหาข้างต้นทำได้ง่ายกว่า แต่จัดเรียงตามหมายเลขคอลัมน์แทน ตัวอย่างเช่นไลบรารี (data.table)

    > x <- data.table(a = 1:3, b = 3:1, c = runif(3))
    > x
         a b         c
    [1,] 1 3 0.2880365
    [2,] 2 2 0.7785115
    [3,] 3 1 0.3297416
    > setcolorder(x, c(3,2,1))
    > x
         c         b a
    [1,] 0.2880365 3 1
    [2,] 0.7785115 2 2
    [3,] 0.3297416 1 3

13
โดยทั่วไปไม่แนะนำให้อ้างถึงคอลัมน์ตามหมายเลขใน data.table และที่อื่น ๆ คำถามที่พบบ่อย data.table ทำให้อาร์กิวเมนต์สำหรับสิ่งนี้ในรายการแรกที่นี่: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.