我需要基于data.frame
中的一组来删除重复的行。
在下面的示例中,每组'a'
个观测值(> 1)需要减少为仅一个观测值,而该观测值必须是time
值较低的观测值:
df_1 = data.frame(time = c(1,2,8,12,19,22,23,30), group = 'a')
df_2 = data.frame(time = c(4,5,6,15,16,18,21,24,25,27), group = 'b')
df = rbind(df_1, df_2)
> df
time group
1 1 a
2 2 a
3 4 b
4 5 b
5 6 b
6 8 a
7 12 a
8 15 b
9 16 b
10 18 b
11 19 a
12 21 b
13 22 a
14 23 a
15 24 b
16 25 b
17 27 b
18 30 a
这是我的预期输出:
time group
1 1 a
3 4 b
4 5 b
5 6 b
6 8 a
8 15 b
9 16 b
10 18 b
11 19 a
12 21 b
13 22 a
15 24 b
16 25 b
17 27 b
18 30 a
有什么建议吗?
谢谢
答案 0 :(得分:2)
我们可以使用group
中的rleid
拆分data.table
,if
group
为a
,然后返回{{1} },对于time
组,按原样返回整个组。
b
答案 1 :(得分:0)
使用data.table
,我们可以轻松得多。只需对'group'(rleid
)的运行长度ID进行分组,order
将i
中的'时间',获得以下行的索引(.I
)的行不是duplicated
的元素,其中“ group”是“ a”或“ b”。用它来细分行
library(data.table)
i1 <- setDT(df)[order(time), .I[!duplicated(group == 'a')|
group == 'b'] , .(grp = rleid(group))]$V1
df[i1]
# time group
# 1: 1 a
# 2: 4 b
# 3: 5 b
# 4: 6 b
# 5: 8 a
# 6: 15 b
# 7: 16 b
# 8: 18 b
# 9: 19 a
#10: 21 b
#11: 22 a
#12: 24 b
#13: 25 b
#14: 27 b
#15: 30 a
注意:不需要if/else
或循环播放
df <- structure(list(time = c(1L, 2L, 4L, 5L, 6L, 8L, 12L, 15L, 16L,
18L, 19L, 21L, 22L, 23L, 24L, 25L, 27L, 30L), group = c("a",
"a", "b", "b", "b", "a", "a", "b", "b", "b", "a", "b", "a", "a",
"b", "b", "b", "a")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18"))