2013-10-08 3 views
-2

R의 3 열의 값에 따라 다음과 같은 구조의 데이터 풀을 하위 그룹으로 정렬해야하지만 알아낼 수는 없습니다.데이터 프레임을 여러 열을 기준으로 하위 그룹으로 나눕니다. R

내가하고 싶은 것입니다 :

  1. 첫째, 정렬 열 V1에 따라 데이터 풀에서, 데이터 풀은 V1의 값에 따라 세 가지 하위 그룹으로 구분한다 (V1의 값을 정렬한다 내림차순).
  2. V2의 값에 따라 3 개의 하위 그룹을 다른 3 개의 하위 그룹으로 정렬하십시오. 이제 9 개의 하위 그룹이 있어야합니다.
  3. 마찬가지로 9 개의 그룹을 다시 3 개의 그룹으로 세분화하고 결과적으로 27 개의 하위 그룹을 만듭니다.

다음 데이터는 간단한 예일 뿐이며 데이터에는 1545 개의 회사가 있습니다.

Firm value V1 V2 V3 
1  7 7 11 8 
2  9 9 11 7 
3  8 14 8 10 
4  9 9 7 14 
5  8 11 15 14 
6  9 10 9 7 
7  8 8 6 14 
8  4 8 11 14 
9  8 10 13 10 
10  2 11 6 13 
11  3 5 12 14 
12  5 12 15 12 
13  1 9 13 7 
14  4 5 14 7 
15  5 10 5 9 
16  5 8 13 14 
17  2 10 10 7 
18  5 12 12 9 
19  7 6 11 7 
20  6 9 14 14 
21  6 14 9 14 
22  8 6 6 7 
23  9 11 9 5 
24  7 7 6 9 
25  10 5 15 11 
26  4 6 10 9 
27  4 13 14 8 

그리고 결과가 있어야한다 : 나는 오랜 시간 동안 노력했다

Firm value V1 V2 V3 
5  8 11 15 14 
12  5 12 15 12 
27  4 13 14 8 
21  6 14 9 14 
18  5 12 12 9 
23  9 11 9 5 
10  2 11 6 13 
3  8 14 8 10 
6  9 10 9 7 
20  6  9 14 14 
9  8 10 13 10 
13  1  9 13 7 
8  4  8 11 14 
2  9  9 11 7 
17  2 10 10 7 
4  9  9 7 14 
7  8  8 6 14 
15  5 10 5 9 
16  5  8 13 14 
25  10 5 15 11 
14  4  5 14 7 
11  3  5 12 14 
1  7  7 11 8 
19  7  6 11 7 
26  4  6 10 9 
24  7  7 6 9 
22  8  6 6 7 

도 성공하지 구글 검색. @Codoremifa 말했듯 :(

+3

데이터를 압축하지 않고 대문자와 소문자를 혼용하지 못하게하는 데 실패합니다. –

+0

당신의 설명이 당신이하고 싶은 것에 연결할 수 없지만'data.table' 패키지를 보셨습니까? – TheComeOnMan

+0

당신은 넥타이를 깰 방법이없는 것 같습니다. 예를 들어 V1과 하위 그룹 모두에 대해 가치가있는 V1이 임의적으로 생성됩니다. – Frank

답변

3

는 data.table 여기에 사용할 수 있습니다 : 이제 그룹이 추가로 열 G1 및 G2를 사용하여 표시되어

require(data.table) 
DT <- data.table(dat) 

DT[order(V1),G1:=rep(1:3,each=9)] 
DT[order(V2),G2:=rep(1:3,each=3),by=G1] 
DT[order(V3),G3:=1:3,by='G1,G2'] 

를 정렬하려면,이 그룹을 쉽게 확인할 수 있도록. ,

setkey(DT,G1,G2,G3) 

질문에 단지 소음 관련이없는 영업 이익의 열 몇 가지를 사용, 이것은 눈으로 작동하는지 확인하기 위해 시도 DT[,list(V1,V2,V3,G1,G2,G3)]

EDIT : OP는 동점을 다루는 방법을 지정하지 않았습니다. 나는 관계를 깰 나중에 열의 값을 사용하는 것이 합리적 생각, 그래서 ...

DT <- data.table(dat) 
DT[order(rank(V1)+rank(V2)/100+rank(V3)/100^2), 
    G1:=rep(1:3,each=9)] 
DT[order(rank(V2)+rank(V3)/100), 
    G2:=rep(1:3,each=3),by=G1] 
DT[order(V3), 
    G3:=1:3,by='G1,G2'] 
setkey(DT,G1,G2,G3) 

DT[27:1]는 (결과는 뒤쪽으로) 여기

Firm value V1 V2 V3 G1 G2 G3 
1: 5  8 11 15 14 3 3 3 
2: 12  5 12 15 12 3 3 2 
3: 27  4 13 14 8 3 3 1 
4: 21  6 14 9 14 3 2 3 
5: 9  8 10 13 10 3 2 2 
6: 18  5 12 12 9 3 2 1 
7: 10  2 11 6 13 3 1 3 
8: 3  8 14 8 10 3 1 2 
9: 23  9 11 9 5 3 1 1 
10: 20  6 9 14 14 2 3 3 
11: 16  5 8 13 14 2 3 2 
12: 13  1 9 13 7 2 3 1 
13: 8  4 8 11 14 2 2 3 
14: 17  2 10 10 7 2 2 2 
15: 2  9 9 11 7 2 2 1 
16: 4  9 9 7 14 2 1 3 
17: 15  5 10 5 9 2 1 2 
18: 6  9 10 9 7 2 1 1 
19: 11  3 5 12 14 1 3 3 
20: 25 10 5 15 11 1 3 2 
21: 14  4 5 14 7 1 3 1 
22: 26  4 6 10 9 1 2 3 
23: 1  7 7 11 8 1 2 2 
24: 19  7 6 11 7 1 2 1 
25: 7  8 8 6 14 1 1 3 
26: 24  7 7 6 9 1 1 2 
27: 22  8 6 6 7 1 1 1 
    Firm value V1 V2 V3 G1 G2 G3 
+0

전체 결과를 보려면'DT' 만 입력하면됩니다. DT [27 : 1]은 역순으로 정렬 된 것을 볼 수 있습니다. – Frank

+0

@wesley 문제가 없습니다. 'rep (c (1,2,3), c (172,171,172)) '또는 비슷한 것이 작동해야합니다. 문서화를 위해'? rep'를 시도하십시오. – Frank

+1

@ Frank 나는 지금 그것을 얻는다, 당신의 좋은 도움을 위해 당신을 순전히 감사하십시오! :) – wesley

0

입니다 다음 transform 등을 사용하여 답변입니다 부터 plyr까지. 나는 넥타이를 언급하지 않는다. 이것은 넥타이의 경우 가장 낮은 행 번호의 값이 먼저 사용된다는 것을 의미한다. 이것은 OP가 예제 출력에서 ​​보여주는 것입니다.

먼저 데이터 집합을 V1의 내림차순으로 정렬하고 새 변수 인 fv1을 만들어 세 개의 그룹 9 개를 만듭니다.

dat1 = transform(dat1[order(-dat1$V1),], fv1 = factor(rep(1:3, each = 9))) 

그럼 V2의 순으로 데이터 세트 주문 fv1의 각 레벨에서 (3)의 세 그룹을 생성한다.

require(plyr) 
dat1 = ddply(dat1[order(-dat1$V2),], .(fv1), transform, fv2 = factor(rep(1:3, each = 3))) 

마지막으로 두 요소와 V3로 데이터 집합을 정렬하십시오.그룹 크기는 요인을 사전에 알려진대로 나는 order

(finaldat = arrange(dat1, fv1, fv2, -V3)) 

이 특히 일반화 대답하지 않습니다에 비해 입력 효율을 plyr에서 arrange를 사용합니다. V3 그룹 크기가 1보다 큰 경우 V2와 비슷한 프로세스가 필요합니다.

+0

당신의 대답을 당신을 감사하십시오 :) – wesley

관련 문제