【问题标题】:Remove duplicates based on order根据顺序删除重复项
【发布时间】:2018-07-09 18:29:11
【问题描述】:

在 R 中,我希望在每个 a 之后删除前两个 b 和 c 之后的所有实例(请注意编号)。 我有以下内容:

1   a
2   b
3   c
4   a
5   b
6   c
7   a
8   b
9   c
10  b
11  c
12  a
13  b
14  c
15  c

我希望将其减少为:

1   a
2   b
3   c
4   a
5   b
6   c
7   a
8   b
9   c
12  a
13  b
14  c

如果可能,我会尝试在 dplyr 管道中执行此操作。 有什么想法吗?

【问题讨论】:

    标签: r duplicates dplyr


    【解决方案1】:

    这个怎么样?

    d <- data.frame(lets = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "b", "c", "a", "b", "c", "c"))
    d %>% 
      mutate(lag1 = lag(lets),
             lag2 = lag(lag1)) %>% 
      filter(is.na(lag2) |
             !(lets == lag1 | lets == lag2 | lag1 == lag2)) %>% 
      select(lets)
    
       lets
    1     a
    2     b
    3     c
    4     a
    5     b
    6     c
    7     a
    8     b
    9     c
    10    a
    11    b
    12    c
    

    【讨论】:

    • 这也有效!非常感谢@Daniel Anderson!我喜欢使用滞后 :)
    【解决方案2】:

    一种可能的解决方案:

    df = read.table(text="1   a
                    2   b
                    3   c
                    4   a
                    5   b
                    6   c
                    7   a
                    8   b
                    9   c
                    10  b
                    11  c
                    12  a
                    13  b
                    14  c
                    15  c",header=F)
    
    library(dplyr)
    df %>% mutate(x=cumsum(V2=='a')) %>%
      group_by(x) %>% 
      filter(!duplicated(V2)) %>% 
      ungroup() %>%
      select(-x)
    

    输出:

    # A tibble: 12 x 2
          V1     V2
       <int> <fctr>
     1     1      a
     2     2      b
     3     3      c
     4     4      a
     5     5      b
     6     6      c
     7     7      a
     8     8      b
     9     9      c
    10    12      a
    11    13      b
    12    14      c
    

    请注意,每次遇到a 后,这都会删除所有重复的元素。如果您只想删除重复的 b 和 c,请考虑:filter(!(duplicated(V2) &amp; (V2=='b' | V2=='c')))

    【讨论】:

    • 这真是太棒了 - 谢谢!我不会想到的 :P :P
    • 没问题,很高兴能帮上忙!对我来说,这也是一个谜,这就是我喜欢 Stack Overflow 的原因;)
    猜你喜欢
    • 2020-07-15
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2022-12-13
    • 2016-09-16
    • 2021-02-09
    相关资源
    最近更新 更多