如何有条件地将观察分组?

时间:2017-08-29 12:58:23

标签: r dplyr

我有以下输入:

C1  C2
1   1
1   1
1   2
1   3
1   4
2   1
.   .

C1和C2是组,其中C2是C1中的嵌套组。现在我想在最小尺寸为2的C1上构建子组。虽然C2中的组不应该被拆分,但我希望拥有尽可能多的组。手动,我首先看一下C1组并将子组2,3和4连接到(G = 1)并将子组1(C2 = 1)作为一组(G = 2)。预期的输出是(其中G是我试图创建的组)

C1  C2  G
1   1   1
1   1   1
1   2   2
1   3   2
1   4   2
2   1   3
.   .   .

我希望它清楚我的意思。任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:2)

使用:

library(data.table)
setDT(mydf)[, G := {r <- rep(1:floor(.N/2), each = 2); if(length(r) != .N) c(r, tail(r,1)) else r}
            , by = C1
            ][, G := rleid(G)][]

你得到:

    C1 C2 G
 1:  1  1 1
 2:  1  1 1
 3:  1  2 2
 4:  1  3 2
 5:  1  4 2
 6:  2  1 3
 7:  2  1 3
 8:  2  2 4
 9:  2  3 4
10:  2  4 4
11:  3  1 5
12:  3  2 5
13:  3  3 6
14:  3  4 6
15:  3  5 6

使用过的数据:

mydf <- structure(list(C1 = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), 
                       C2 = c(1L, 1L, 2L, 3L, 4L, 1L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 5L)), 
                  .Names = c("C1", "C2"), class = "data.frame", row.names = c(NA, -15L))