Як упорядкувати стовпці 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справді.
Метт Даул

2
@MatthewDowle - дякую за роз’яснення. Я вважав, що це було так, але не був на 100% впевнений.
Чейз

3
чи можу я це зробити для підмножини стовпців? Наприклад, коли я просто хочу перейти до стовпців на фронт?
Пітер Пан

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

6
@PeterPan Дивіться також НОВИНИ про версію devel 1.10.5 : " setcolorder()тепер ncol(DT)приймається менше, ніж стовпчики, щоб бути переміщені на фронт"
Генрік

12

Можливо, легше використовувати вищезазначене рішення, але замість цього сортувати за номером стовпця Наприклад: бібліотека (таблиця даних)

    > 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
Франк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.