R:使用多对多映射根据另一列过滤一列
R: Filter one column based on another with many to many mapping
我有一个包含 ID 列和项目列的数据集。 ID 映射到一个或多个项目。数据集的每个项目都有一行映射到一个 ID。我想要 return 个包含 my_items
的 ID。项目的顺序无关紧要。我在下面有一个玩具示例。
ID <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5)
item <- c("a", "b", "c", "a", "b", "c", "d", "a", "b", "d", "b", "a", "c")
df <- data.frame(cbind(ID, item))
df
my_items <- c("a", "b", "c")
我的预期输出将仅包含项目 ID 1 和 5。
我们可以在使用 %in%
创建逻辑向量并按 'ID' 分组后使用 all
,还可以使用 n_distinct
创建条件
library(dplyr)
df %>%
group_by(ID) %>%
filter(all(my_items %in% item), n_distinct(item) == 3) %>%
ungroup
-输出
# A tibble: 6 × 2
ID item
<dbl> <chr>
1 1 a
2 1 b
3 1 c
4 5 b
5 5 a
6 5 c
df %>%
group_by(ID) %>%
filter(setequal(item,my_items))
输出
ID item
<chr> <chr>
1 1 a
2 1 b
3 1 c
4 5 b
5 5 a
6 5 c
如果我们添加arrange
,我们也可以在这种情况下使用identical
:
library(dplyr)
df %>%
group_by(ID) %>%
arrange(item, .by_group = TRUE) %>%
filter(identical(item,my_items))
ID item
<chr> <chr>
1 1 a
2 1 b
3 1 c
4 5 a
5 5 b
6 5 c
我有一个包含 ID 列和项目列的数据集。 ID 映射到一个或多个项目。数据集的每个项目都有一行映射到一个 ID。我想要 return 个包含 my_items
的 ID。项目的顺序无关紧要。我在下面有一个玩具示例。
ID <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5)
item <- c("a", "b", "c", "a", "b", "c", "d", "a", "b", "d", "b", "a", "c")
df <- data.frame(cbind(ID, item))
df
my_items <- c("a", "b", "c")
我的预期输出将仅包含项目 ID 1 和 5。
我们可以在使用 %in%
创建逻辑向量并按 'ID' 分组后使用 all
,还可以使用 n_distinct
library(dplyr)
df %>%
group_by(ID) %>%
filter(all(my_items %in% item), n_distinct(item) == 3) %>%
ungroup
-输出
# A tibble: 6 × 2
ID item
<dbl> <chr>
1 1 a
2 1 b
3 1 c
4 5 b
5 5 a
6 5 c
df %>%
group_by(ID) %>%
filter(setequal(item,my_items))
输出
ID item
<chr> <chr>
1 1 a
2 1 b
3 1 c
4 5 b
5 5 a
6 5 c
如果我们添加arrange
,我们也可以在这种情况下使用identical
:
library(dplyr)
df %>%
group_by(ID) %>%
arrange(item, .by_group = TRUE) %>%
filter(identical(item,my_items))
ID item
<chr> <chr>
1 1 a
2 1 b
3 1 c
4 5 a
5 5 b
6 5 c