group_by 并且过滤器删除了太多行

group_by and filter removes too many rows

下面是我的示例,让我解释一下我正在尝试做的事情,尽管它并没有像我想要的那样工作。

我需要找到同一个人在同一日期的 z 列中有 2 个以上唯一值的所有实例。但是,我需要找到 z 列中特定值列表的位置。

library(tidyverse)

x <- c("Person A","Person A","Person A","Person A","Person A","Person A")
y <- c("2022-01-01","2022-01-01","2022-01-20","2022-02-01","2022-02-01","2022-02-01")
z <- c("A","D","A","A","C","B")

df <- data.frame(x,y,z)
df

df %>% 
  group_by(x,y) %>% 
  mutate(unique_z = n_distinct(z)) %>% 
  # ungroup() %>% 
  filter(unique_z > 1,
         z %in% c("C","B"))

下面是我想要输出的图像,但我无法理解。

应该删除第 1 行和第 2 行,因为即使它是同一个人在同一日期的 2 个唯一的 z 值,它也不包括“C”或“B”。

第 3 行已被删除,因为它只是那个人和日期的一个唯一值。

第 4、5 和 6 行都应该保留,因为那个人、日期组合具有三个唯一的 z 值。此外,“C”and/or“B”出现在这些行中。出于某种原因,第 4 行每次都被删除。我要查看那个人的其他 z 值,日期组合。我以为分组和过滤可以做到这一点,但它似乎不是我这样做的方式。

您需要使用 any 检查每个组中是否存在 c("B", "C"),而不是在每一行中;见下文:

library(dplyr)

df %>% 
  group_by(x,y) %>% 
  mutate(unique_z = n_distinct(z)) %>% 
  filter(unique_z > 1,
         any(z %in% c("B","C")))
## any(z %in% c("C")) & any(z %in% c("B"))) 
## use this one instead if you want B and C present at the same time ...
## ... and two B's or two C's are not desired

# # A tibble: 3 x 4
# # Groups:   x, y [1]
#   x        y          z     unique_z
#   <fct>    <fct>      <fct>    <int>
# 1 Person A 2022-02-01 A            3
# 2 Person A 2022-02-01 C            3
# 3 Person A 2022-02-01 B            3