在 dplyr 的 group_by 中有条件地删除重复行

标签 r dplyr

我知道有很多关于删除重复项的内容,但我的问题似乎有所不同。


我有一个类似这样的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

我在这里有一个类似的问题:Ignore value conditionally within group_by in dplyr我基于此进行以下尝试。但这些都不起作用,这让我抓狂。

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 package 创建于 2018-08-17 (v0.2.0).

我猜问题是 duplicated() 调用没有返回 TRUEFALSE 但我不确定。

最佳答案

按“id”、“date”分组后,获取“code”为“a”的逻辑向量,在其上或“code”不是“a”的地方使用duplicated

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    

关于在 dplyr 的 group_by 中有条件地删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51898767/

相关文章:

r - 使用 dplyr/tidyr 在 R 中格式化/生成新表

r - 如何围绕模型估计手动绘制 SE/CI

r - 如何感谢 R 包(使用 roxygen2)的想法(而非代码)贡献者?

c++ - 如何使用 Rcpp 库将 C++ 中包含 double 值的 vector vector 转换为 R 中的矩阵?

r - 计算与列值匹配的第一行和 n 行之间的持续时间/差异

r - 如何将 lapply 的结果组合到 data.frame?

r - R 中带有rep 和 dplyr 管道的 mapply 的奇怪行为

r - 具有附加条件的唯一唯一变量的累积和

r - 获得与上月底的差额

r - 复杂热图 : Increase label size of side annotation?