r-在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的group_by来查找对于给定的地址/邮政编码分组至少有一个TRUE和至少一个FALSE邮件的情况。我正在寻找的结果是:

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)

我没有结果。

使用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))

您可以使用每组的标准差(sd()(来筛选出那些只有一个值的组。

library(dplyr)
df %>%
group_by(address, zip_code) %>%
filter(sd(mailout) > 0)
#   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  

最新更新