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
下面是我的示例,让我解释一下我正在尝试做的事情,尽管它并没有像我想要的那样工作。
我需要找到同一个人在同一日期的 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