-2

Rの3列の値に基づいて、次の構造のデータプールをサブグループにソートする必要がありますが、わかりません。

私がやりたいことは次のとおりです。

  1. まず、列 に基づいてデータプールをソートします。データV1プールは の値に従って 3 つのサブグループに分割する必要がありますV1( の値はV1最初に降順でソートする必要があります)。
  2. の値に従って、3 つのサブグループのそれぞれを別の 3 つのサブグループに分類すると、V29 つのサブグループが必要になります。
  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

私は長い間試してきましたが、Googleも検索しても成功しませんでした。:(

4

2 に答える 2

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
于 2013-10-08T19:01:45.673 に答える
0

これは、 を使用してからを使用transformした回答です。同点については触れません。つまり、同点の場合は、行番号が最も小さい値が最初に使用されます。これは、出力例で OP が示しているものです。ddplyplyr

まず、データセットを V1 の降順に並べ替え、新しい変数 を作成して 9 つのグループを 3 つ作成しますfv1

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

次に、データセットを V2 の降順に並べ替え、 の各レベル内に 3 つのグループを 3 つ作成しますfv1

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

最後に、データセットを 2 つの因子と V3 で並べ替えます。と比較して入力効率のためにarrangefromを使用しますplyrorder

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

グループのサイズは因子に対して事前にわかっているため、これは特に一般化できる答えではありません。V3グループ サイズが 1 より大きい場合は、V2 と同様のプロセスが必要になります。

于 2013-10-08T21:39:48.627 に答える