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 2012 년

2
@MatthewDowle-설명에 감사드립니다. 그럴 수도 있다고 생각했지만 100 % 확신하지는 못했습니다.
Chase

3
열의 하위 집합에 대해 그렇게 할 수 있습니까? 예를 들어 맨 앞으로 열로 이동하고 싶을 때?
Peter Pan

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

6
@PeterPan 또한 개발자 버전 1.10.5에 대한 뉴스를 참조하십시오 . " setcolorder()이제 ncol(DT)앞으로 이동할 열 보다 적은 열을 허용 합니다."
Henrik

12

위의 솔루션을 사용하는 것이 더 쉬울 수 있지만 대신 열 번호로 정렬합니다. 예 : 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(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 faq는 여기 첫 번째 항목에서 이에 대한 주장을합니다 : datatable.r-forge.r-project.org/datatable-faq.pdf
Frank
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.