基于重复ID的子集,如果value是下一行的另一列中的value的重复项

时间:2018-10-25 12:59:14

标签: r dplyr duplicates data.table subset

我有一个看起来像这样的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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

这里是使用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