我有一个与此结构匹配的数据表:
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