根据data.frame中的一组从行的大块中删除重复项

时间:2019-04-13 09:50:16

标签: r dataframe duplicates

我需要基于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

有什么建议吗?

谢谢

2 个答案:

答案 0 :(得分:2)

我们可以使用group中的rleid拆分data.tableif groupa,然后返回{{1} },对于time组,按原样返回整个组。

b

答案 1 :(得分:0)

使用data.table,我们可以轻松得多。只需对'group'(rleid)的运行长度ID进行分组,orderi中的'时间',获得以下行的索引(.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"))