2014-03-31 5 views
2

키가 xy 인 data.table이 있고 각 키 내에서 z 열로 정렬하려고합니다.각 키 내의 열로 데이터 테이블 정렬

> DT 
    x y   z 
1: a a 0.5526312 
2: a a 0.6339102 
3: a a -0.7490821 
4: a a -0.6850176 
5: a a 1.7943156 
6: a b 0.9271090 
7: a b 1.3936642 
8: a b 1.4815404 
9: a b -0.7850981 
10: a b -1.0487700 
11: b c 1.5184297 
12: b c -0.4640705 
13: b c -0.6513462 
14: b c -0.5568319 
15: b c 1.5422990 
16: b d 0.8810654 
17: b d -0.1895812 
18: b d -2.6263378 
19: b d 0.7371594 
20: b d 1.4122076 

내 첫 번째 시도는 그러나,이 정렬 된 키 입력 열을 유지하지 않습니다, DT[order(z), .SD, by = list(x, y)]입니다. 나는 두 단계에서이 작업을 수행 할 수 있습니다 알고 : 당신은 키가 정렬 될 때 열 z이 정렬 상태로 유지됩니다 기대하고 있기 때문에

DT <- DT[order(x, y, z)] 
setkeyv(DT, c('x', 'y')) 

그러나, 이것은 좋은 방법은 아닌 것 같아. 나중에 키로 사용되지 않기 때문에 키로 z을 설정하고 싶지 않습니다. 이것을 달성하기위한보다 우아한 방법이 있습니까?

setkey(DT, x, y, z) 
setkey(DT, x, y) 

사용 setkey이 세 열을 기준으로 정렬 한 다음를 재설정하여 키에서 마지막 열을 제거하기 : 왜

+1

키를 'x, y, z'로두면 정확히 무엇이 문제입니까? – Arun

+0

@Arun : 문제가되지 않을 수도 있습니다. 나는이 data.table을 다른 data.table과 x와 y로만 결합 할 수 있기 때문에, 일을 단순하게 유지하는 것이 좋습니다. – ezbentley

답변

3

. 또한, 유지되고 정렬에 대한 우려를 해결하기 위해,이 설명되어 있습니다 (data.table 문서의 세부 사항 섹션의 두 번째 단락) :

정렬이 안정; 즉, 넥타이의 순서 (존재한다면)가 보존된다.

은 후 x의 집합 내에서 x, yz에 의해 z의 주문을 분류 한 때를 일종의 xy, 에 의한 것을 의미한다 - y 값이 그대로있을 것입니다 모두 넥타이 때문에 x - y

+0

실제로 생각해 보았지만, 키가 리셋 될 때'z'가 여전히 소트되고 있는지 확실하지 않았습니다. – ezbentley

+0

@ezbentley, 대답 업데이트를 참조하십시오. – BrodieG

+0

감사. 그 종류가 안정적인지 확신 할 수 없었습니다. – ezbentley

1

z를 포함하는 키를 설정 한 다음 설정을 해제 할 수 있습니다. x와 y에서 z로 정렬 된 채로 있지만 더 이상 키가 아닙니다.

setkey(DT, x, y, z) 
setkey(DT, x, y) 
관련 문제