Cách sắp xếp lại các cột data.table (không sao chép)


118

Tôi muốn sắp xếp lại các cột trong tôi data.table x, cho một vector đặc trưng của tên cột, neworder:

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

Rõ ràng là tôi có thể làm:

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

nhưng điều đó sẽ yêu cầu sao chép lại toàn bộ tập dữ liệu. Có một cách khác để làm điều này?

Câu trả lời:


183

Sử dụng 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

Từ ?setcolorder:

Nói data.tabletheo cách nói, tất cả các set*hàm thay đổi đầu vào của chúng bằng cách tham chiếu. Có nghĩa là, không có bản sao nào được tạo ra, ngoài bộ nhớ làm việc tạm thời, dung lượng lớn bằng một cột.

vì vậy sẽ khá hiệu quả. Xem ?setcolorderchi tiết.


21
Làm rõ nhỏ: setcolorderdi chuyển các con trỏ cột xung quanh mà không sử dụng bất kỳ bộ nhớ làm việc nào. Câu đó về việc sử dụng bộ nhớ làm việc lớn như một cột là setkeythực sự.
Matt Dowle

2
@MatthewDowle - cảm ơn bạn đã làm rõ. Tôi nghĩ điều đó có thể xảy ra, nhưng không chắc chắn 100%.
Đuổi theo

3
tôi có thể làm điều đó cho một tập hợp con các cột không? Ví dụ khi tôi chỉ muốn di chuyển đến các cột ở phía trước?
Peter Pan,

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

6
@PeterPan Xem thêm TIN TỨC về phiên bản phát triển 1.10.5 : " setcolorder()hiện chấp nhận ít hơn ncol(DT)cột được chuyển lên phía trước"
Henrik

12

Người ta có thể thấy dễ dàng hơn khi sử dụng giải pháp trên, nhưng thay vào đó hãy sắp xếp theo số cột. Ví dụ: thư viện (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
Nói chung không khuyến khích tham chiếu đến các cột theo số, trong data.table và các nơi khác. Câu hỏi thường gặp về data.table đưa ra lập luận cho điều này trong mục đầu tiên ở đây: datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.