首页 > 解决方案 > 在 dplyr 的 group_by 中有条件地删除重复行

问题描述

我知道那里有很多删除重复项的方法,但我的问题似乎不同。


我有一个data.frame类似的:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
x <- data.frame(id = c(1, 1, 1, 1, 2, 3, 3),
                date = as.Date(c("2016-04-24", "2016-04-24", "2016-04-24",
                                 "2016-04-24", "2016-04-24", "2016-04-28",
                                 "2016-04-28")),
                code = c("a", "b", "b", "a", "a", "a", "a"))
x
#>   id       date code
#> 1  1 2016-04-24    a
#> 2  1 2016-04-24    b
#> 3  1 2016-04-24    b
#> 4  1 2016-04-24    a
#> 5  2 2016-04-24    a
#> 6  3 2016-04-28    a
#> 7  3 2016-04-28    a

我想过滤掉code“a”而不是“b”的所有重复项。预期的输出应如下所示:

x[c(1:3, 5:6), ]
#>   id       date code
#> 1  1 2016-04-24    a
#> 2  1 2016-04-24    b
#> 3  1 2016-04-24    b
#> 5  2 2016-04-24    a
#> 6  3 2016-04-28    a

我在这里有一个类似的问题:在 dplyr 中的 group_by 内有条件地忽略值,我以此为基础进行以下尝试。但这些不起作用,这让我发疯。

x %>% group_by(id, date) %>% 
  filter(!(code == "a" & duplicated(code) == "a"))
#> # A tibble: 7 x 3
#> # Groups:   id, date [3]
#>      id date       code 
#>   <dbl> <date>     <fct>
#> 1    1. 2016-04-24 a    
#> 2    1. 2016-04-24 b    
#> 3    1. 2016-04-24 b    
#> 4    1. 2016-04-24 a    
#> 5    2. 2016-04-24 a    
#> 6    3. 2016-04-28 a    
#> 7    3. 2016-04-28 a


x %>% group_by(id, date) %>% 
  filter(!(duplicated(code) == "a" & "a" %in% code))
#> # A tibble: 7 x 3
#> # Groups:   id, date [3]
#>      id date       code 
#>   <dbl> <date>     <fct>
#> 1    1. 2016-04-24 a    
#> 2    1. 2016-04-24 b    
#> 3    1. 2016-04-24 b    
#> 4    1. 2016-04-24 a    
#> 5    2. 2016-04-24 a    
#> 6    3. 2016-04-28 a    
#> 7    3. 2016-04-28 a

reprex 包(v0.2.0) 于 2018 年 8 月 17 日创建。

我想问题duplicated()出在没有返回的电话上,TRUE或者FALSE我不确定。

标签: rdplyr

解决方案


按'id','date'分组后,获取'code'为'a'的逻辑向量,使用duplicated它或'code'不是'a'

x %>% 
  group_by(id, date) %>% 
  filter(!duplicated(code == "a") | code != 'a')
# A tibble: 5 x 3
# Groups:   id, date [3]
#     id date       code 
#  <dbl> <date>     <fct>
#1     1 2016-04-24 a    
#2     1 2016-04-24 b    
#3     1 2016-04-24 b    
#4     2 2016-04-24 a    
#5     3 2016-04-28 a    

推荐阅读