我必须根据R中3列的值将具有以下结构的数据池排序到子组中,但我无法弄明白。
我想做的是:
V1
对数据池进行排序,数据池应根据V1
的值分为三个子组(V1
的值应按降序排序起初)。V2
的值将3个子组中的每个子组分为另外3个子组,现在我们应该有9个子组。以下数据只是一个简单的例子,数据有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
我已经尝试了很长时间,也没有成功搜索谷歌。 :(
答案 0 :(得分: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
答案 1 :(得分:0)
以下是使用transform
然后来自ddply
的{{1}}的答案。我没有解决这种关系,这实际上意味着在平局的情况下,首先使用最低行数的值。这就是OP在示例输出中显示的内容。
首先,按V1的降序对数据集进行排序,并通过创建新变量plyr
创建三组9。
fv1
然后按V2的降序对数据集进行排序,并在dat1 = transform(dat1[order(-dat1$V1),], fv1 = factor(rep(1:3, each = 9)))
的每个级别内创建三组3个。
fv1
最后按两个因子和V3排序数据集。我使用require(plyr)
dat1 = ddply(dat1[order(-dat1$V2),], .(fv1), transform, fv2 = factor(rep(1:3, each = 3)))
中的arrange
作为与plyr
order
这不是一个特别普遍的答案,因为群体大小事先已知因素。如果(finaldat = arrange(dat1, fv1, fv2, -V3) )
组大小大于1,则需要与V2类似的过程。