首页 > 解决方案 > 在 dplyr group_by 中过滤,以便保留符合某些条件的行组合

问题描述

我有一个与此结构匹配的数据表:

address,zip_code,date,mailout
2 Lafayette St,90210,06/12/10,FALSE
2 Lafayette St,90210,04/01/12,FALSE
Higgens Square,62561,02/12/10,FALSE
Higgens Square,62561,28/03/13,TRUE
55 The Wren,91234,23/08/18,TRUE
55 The Wren,91234,19/09/13,FALSE
9A Sylvan Road,54332,16/11/10,TRUE
9A Sylvan Road,54332,31/01/17,FALSE

我正在尝试使用 dplyr来查找给定地址/邮政编码分组至少有一个和至少一个mailout 的group_by情况。我正在寻找的结果是这样的:TRUEFALSE

address,zip_code,date,mailout
Higgens Square,62561,02/12/10,FALSE
Higgens Square,62561,28/03/13,TRUE
55 The Wren,91234,23/08/18,TRUE
55 The Wren,91234,19/09/13,FALSE
9A Sylvan Road,54332,16/11/10,TRUE
9A Sylvan Road,54332,31/01/17,FALSE

当我尝试

df %>% group_by(address, zip_code) %>% filter(mailout == TRUE | mailout == FALSE)

我得到所有行返回。

当我尝试

df %>% group_by(address, zip_code) %>% filter(mailout == TRUE & mailout == FALSE)

我没有得到任何结果。

标签: rdplyrtidyverse

解决方案


使用any

library(dplyr)
df %>% group_by(address, zip_code) %>% filter(any(mailout) && any(!mailout))

#  address        zip_code date     mailout
#  <chr>             <int> <chr>    <lgl>  
#1 Higgens Square    62561 02/12/10 FALSE  
#2 Higgens Square    62561 28/03/13 TRUE   
#3 55 The Wren       91234 23/08/18 TRUE   
#4 55 The Wren       91234 19/09/13 FALSE  
#5 9A Sylvan Road    54332 16/11/10 TRUE   
#6 9A Sylvan Road    54332 31/01/17 FALSE  

或者all让每个组只获得一个值,您可以使用该值来决定是否保留该组。

df %>% group_by(address, zip_code) %>% filter(all(c(TRUE, FALSE) %in%  mailout))

推荐阅读