我有一个如下的数据框
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
。我想要做的是仅为a
,b
和c
分别说两组。对此有任何一线解决方案吗?
输出如下所示
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)并且无法提前知道,因此解决方案必须独立于此初始值小组数量。
答案 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