data.table의 행을 문자열 키 'order (-x, v)'에서 내림차순으로 정렬하면 data.table 1.9.4 이전 버전에서 오류가 발생합니다.


125

하자 내가 다음이 있다고 가정 data.table의를 R:

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

두 개의 열 (예 : x및 열 v) 로 주문하고 싶습니다 . 나는 이것을 사용했다 :

 DT[order(x,v)] # sorts first by x then by v (both in ascending order)

하지만 이제는 x(내림차순으로) 정렬 하고 다음 코드가 있습니다.

  DT[order(-x)] #Error in -x : invalid argument to unary operator

따라서이 오류는 class(DT$x)=character. 이 문제를 해결하기 위해 어떤 제안을 해주시겠습니까?

를 사용할 수 있다는 것을 알고 DT[order(x,decreasing=TRUE)]있지만 동시에 두 가지 방법 (일부 감소, 일부 증가)을 사용하여 여러 열을 정렬하는 구문을 알고 싶습니다.

사용 DT[order(-y,v)]하면 결과는 괜찮지 만 사용 DT[order(-x,v)]하면 오류가 있습니다. 제 질문은이 오류를 해결하는 방법입니다.


6
흥미로운 질문이지만 큰 데이터 세트로 작업하는 경우 data.tables에 대한 키를 설정해야 할 것입니다. 키는 후속 인덱싱, 부분 집합 화, 그룹 별 집계 등을 최대화하는 순서로 데이터를 배치합니다. 이는 데이터를 인쇄하는 데 선호되는 형식 아닐 수 있지만 얻을 수있는 속도에 대해 지불하는 것은 종종 적은 비용입니다. .
Josh O'Brien

그러나 실제로는 작동 하지만 다른 하나는 작동하지 않기 때문에 DT[order(-x)]동일한 진술이 아닌 것으로 보입니다 . 동등한 명령문은 DT <-DT [order (-x)] setorder (DT, -x) R을 처음 접했으므로 실수하면 수정하십시오. setorder(DT, -x)setorder()DT
jeromeResearch

@jerome 당신이 맞습니다. Pankil은 동등하다고 말하지 않았으므로 그대로 괜찮은 것 같아요.
프랭크

1
나는 제목 편집이 의미가 있다는 @smci에 동의하지만,이 질문이 더 이상 관련이 없음을 나타내도록 변경합니다. Google에서 다른 것을 기대하고 여기에 계속 착륙하십시오. 나는 내 질문 중 하나를 가지고 이것을했다. stackoverflow.com/questions/30035939/…
Frank

1
Nestorggh, 개선 할 수없는 경우 새 타이틀을 롤백하지 마십시오. "data.table의 정렬 행"은 거의 아무것도 말하지 않았으며 기본 기능은 yonks에 있습니다. 제목은 실제 문제를 언급해야합니다 (하나가 감소 순서 인 여러 키). 이것은 1.9.4 및 이전 버전에서 알려진 문제였으며 더 이상 문제가되지 않는다는 점도 중요합니다.
smci

답변:


144

최신 정보

data.table v1.9.6 +는 이제 OP의 원래 시도를 지원하며 다음 답변은 더 이상 필요하지 않습니다.


사용할 수 있습니다 DT[order(-rank(x), y)].

   x y v
1: c 1 7
2: c 3 8
3: c 6 9
4: b 1 1
5: b 3 2
6: b 6 3
7: a 1 4
8: a 3 5
9: a 6 6

1
아래 @PankilShah가 지적했듯이 이것은 얼마 동안 수정되었으며 OP의 원래 접근 방식은 이제 예상대로 작동합니다. 커밋이 C 레벨에서 수정 되었기 때문에 찾을 수 없었고 무엇을 검색해야할지 모르겠습니다.
MichaelChirico

1
감사합니다. 아무도 여기에 올 것 같지는 않지만 ... 다른 한편으로 나 자신은 막연하게 관련된 인터넷 검색을 통해 여기에 왔습니다.
MichaelChirico

@MichaelChirico 실제로, 나는이 답변에 대해 정기적으로 찬성 투표를 받기 때문에 이것을 지적 해 주셔서 정말 기쁩니다. 나는 실제로 data.table 사용자가 아니며 개발을 따라 가지 못했습니다.
Matthew Plourde

실제 릴리스 번호 (1.9.6?)를 명시하는 것이 매우 유용하므로 NEWS.md의 아카이브 에서 사냥 할 필요가 없습니다 .
smci

23

-숫자 항목 에만 사용할 수 있으므로 감소를 사용하고 원하는 항목을 오름차순으로 부정 할 수 있습니다.

DT[order(x,-v,decreasing=TRUE),]
      x y v
 [1,] c 1 7
 [2,] c 3 8
 [3,] c 6 9
 [4,] b 1 1
 [5,] b 3 2
 [6,] b 6 3
 [7,] a 1 4
 [8,] a 3 5
 [9,] a 6 6

3
두 개의 character열이 있고 하나는 증가하고 다른 하나는 감소하는 정렬을 원하지 않는 한, 저는 이런 방식을 좋아합니다 .
Matthew Plourde 2012 년

1
@mplourde 나는 당신이 제기 한 문제를 해결하기 위해 당신의 솔루션을이 솔루션과 결합 할 수 있다고 생각합니다. 예를 들어, 당신은 넣을 수 있습니다 : DT[order(x,-rank(w),decreasing=TRUE)]주어진 xw두 문자 열입니다. 감사합니다!
nhern121 2015 년

17

DT[order(-x)]예상대로 작동합니다. data.table 버전 1.9.4가 있습니다. 아마도 이것은 최신 버전에서 수정되었을 것입니다.
또한 다음 setorder(DT, -x)과 같은 set * 명령과 일치 하는 구문을 제안합니다 setnames.setkey

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.