【问题标题】:Subset based on duplicated ID and if value is a duplicate of value in another column of the subsequent row基于重复 ID 的子集,如果 value 与后续行的另一列中的 value 重复
【发布时间】:2018-10-25 12:59:14
【问题描述】:

我有一个 data.frame df 看起来像这样

ID      VALUE_1   VALUE_2   VALUE_3
Pete      55        52         53
Amber     23        33         47
Amber     47        25         69
Bob       34        25         52
Bob       52        78         93
Bob       93        11         83
Alfie     24        75         52
Alfie     13        64         32

我有兴趣仅保留名称方面的重复项,如果VALUE_3 与后续的VALUE_1 相等/重复,则产生结果输出:

ID      VALUE_1   VALUE_2   VALUE_3
Amber     23        33         47
Amber     47        25         69
Bob       34        25         52
Bob       52        78         93
Bob       93        11         83

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr duplicates data.table subset


    【解决方案1】:

    这是一个使用tidyverse 的想法。我们按ID 分组,并删除所有只有 1 个观察值的组。然后我们创建一个逻辑列,其 values_3 与下一个 value_1 相等。然后我们使用fill 填充语句,并使用该变量进行过滤

    library(tidyverse)
    
    df %>% 
     group_by(ID) %>% 
     filter(n() > 1) %>% 
     mutate(new = VALUE_3 == lead(VALUE_1)) %>% 
     fill(new) %>% 
     filter(new) %>% 
     ungroup() %>% 
     select(-new)
    

    给出,

    # A tibble: 5 x 4
      ID    VALUE_1 VALUE_2 VALUE_3
      <fct>   <int>   <int>   <int>
    1 Amber      23      33      47
    2 Amber      47      25      69
    3 Bob        34      25      52
    4 Bob        52      78      93
    5 Bob        93      11      83
    

    实现上述目标的几种data.table 方法(@akrun 和@Frank 的赞美)

    library(data.table)
    
    setDT(df)[, .SD[cummax(.N >1 & VALUE_3 == shift(VALUE_1, type = 'lead', fill = last(VALUE_1))) > 0], ID]  -- #akrun
    
    w = DF[VALUE_1 == shift(VALUE_3) & ID == shift(ID), which = TRUE] 
    DF[unique(sort(c(w, w-1)))] -- #Frank
    

    【讨论】:

    • 也许这也可以library(data.table);setDT(df)[, .SD[cummax(.N &gt;1 &amp; VALUE_3 == shift(VALUE_1, type = 'lead', fill = last(VALUE_1))) &gt; 0], ID]
    • 或者没有任何group-by操作:w = DF[VALUE_1 == shift(VALUE_3) &amp; ID == shift(ID), which = TRUE]; DF[unique(sort(c(w, w-1)))]
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2022-07-07
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2011-12-24
    相关资源
    最近更新 更多