2013-10-08 22 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 

我已經嘗試了很長時間,還搜查谷歌沒有成功。 :(

+3

Downvoting可能導致大規模數據失敗並且不會緊湊地格式化數據。 –

+0

我無法將你的輸出連接到你想要做什麼的描述,但是你看看'data.table'包嗎? – TheComeOnMan

+0

看來你沒有打破紐帶的方法。舉例來說,你已經有V1在底部和中間組上看到價值8,看似任意。 – Frank

回答

3

正如@Codoremifa說,data.table這裏可以使用:

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'] 

現在你的團體所使用的附加列G1和G2標籤進行排序,使之更容易看到的組。使用

setkey(DT,G1,G2,G3) 

一對夫婦的OP的列都只是噪音問題無關的;以驗證該作品由眼,儘量DT[,list(V1,V2,V3,G1,G2,G3)]

編輯: 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

@弗蘭克我現在得到它,非常感謝你的幫助!:) – wesley

0

下面是使用transform,然後回答ddplyplyr。我沒有解決關係問題,這實際上意味着如果是平行關係,則最先使用最低行號的值。這是OP在示例輸出中顯示的內容。

首先,按照V1的降序對數據集進行排序,並通過創建一個新變量fv1來創建三組。

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對數據集進行排序。我用arrangeplyr打字效率相比order

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

這不是一個特別的一般化的答案,作爲組大小是預先已知的用於的因素。如果V3組大小大於1,則需要與V2相似的過程。

+0

謝謝你的回答:) – wesley