在数据框中以特定间隔删除行

时间:2015-12-04 20:40:47

标签: r dataframe

我有一个如下的数据框

 structure(list(c1 = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 3, 2, 1, 3, 
2, 1, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1), c2 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", "b", 
"c"), class = "factor")), .Names = c("c1", "c2"), row.names = c(NA, 
-27L), class = "data.frame")


   c1 c2
1   1  a
2   2  a
3   3  a
4   1  a
5   2  a
6   3  a
7   1  a
8   2  a
9   3  a
10  3  b
11  2  b
12  1  b
13  3  b
14  2  b
15  1  b
16  3  b
17  2  b
18  1  b
19  2  c
20  3  c
21  1  c
22  2  c
23  3  c
24  1  c
25  2  c
26  3  c
27  1  c

在上面的数据框中,a有3组(1,2,3),b有3组(3,2,1),3组(2, 3,1)为c。我想要做的是仅为abc分别说两组。对此有任何一线解决方案吗?

输出如下所示

    c1 c2
1   1  a
2   2  a
3   3  a
4   1  a
5   2  a
6   3  a
7   3  b
8   2  b
9   1  b
10  3  b
11  2  b
12  1  b
13  2  c
14  3  c
15  1  c
16  2  c
17  3  c
18  1  c

注意:c2每个类别的初始组数可以是任何值(此处为3)并且无法提前知道,因此解决方案必须独立于此初始值小组数量。

1 个答案:

答案 0 :(得分:2)

这是一个使用 data.table 的选项。假设df是您的原始数据。

library(data.table)
setDT(df)
df[sort(df[, .I[1:2], by = .(c1, c2)]$V1)]

我们想要保留的组数由1:2(前两个)给出。因此,如果您想要更多或更少,您可以将2更改为您想要保留的多个组。上面的代码给出了

    c1 c2
 1:  1  a
 2:  2  a
 3:  3  a
 4:  1  a
 5:  2  a
 6:  3  a
 7:  3  b
 8:  2  b
 9:  1  b
10:  3  b
11:  2  b
12:  1  b
13:  2  c
14:  3  c
15:  1  c
16:  2  c
17:  3  c
18:  1  c