在R中连续地基于若干列将数据帧划分为子组

时间:2013-10-08 18:33:40

标签: r sorting

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

我想做的是:

  1. 首先,根据列V1对数据池进行排序,数据池应根据V1的值分为三个子组(V1的值应按降序排序起初)。
  2. 根据V2的值将3个子组中的每个子组分为另外3个子组,现在我们应该有9个子组。
  3. 同样,将9组中的每组再次细分为3组,共计27个小组。
  4. 以下数据只是一个简单的例子,数据有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
    

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

2 个答案:

答案 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类似的过程。