-2

我必须根据 R 中 3 列的值将具有以下结构的数据池排序为子组,但我无法弄清楚。

我想做的是:

  1. 首先,根据列V1对数据池进行排序,数据池应按照 的值分为三个子组V1( 的值V1应首先按降序排序)。
  2. 根据 的值将 3 个子组中的每一个排序为另外 3 个子组V2,现在我们应该有 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

我已经尝试了很长时间,也搜索了谷歌没有成功。:(

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然后ddplyfrom的答案plyr。我没有解决平局问题,这实际上意味着在平局的情况下,首先使用最低行号的值。这就是 OP 在示例输出中显示的内容。

首先,按 V1 的降序对数据集进行排序,并通过创建一个新变量来创建三组 9 fv1

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

然后按照 V2 的降序对数据集进行排序,并在每个级别内创建三组 3 fv1

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

最后按两个因子和 V3 对数据集进行排序。我使用arrangefromplyr来提高打字效率order

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

这不是一个特别普遍的答案,因为事先知道组大小的因素。如果V3组大小大于 1,则需要与 V2 类似的过程。

于 2013-10-08T21:39:48.627 回答