使用 dplyr 进行多条件过滤连接
multiple criteria filtering join using dplyr
我试图通过创建一个名为 event_f
的 df
来完成下面描述的操作。
我想从 detail
df
作为过滤条件,所有具有 type_id == 6
的 event_id
不包括 6 和 3 或 6 和 7 的组合。
请注意,可以有其他组合,但它们都将包含在内。
library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.5.3
#> Warning: package 'purrr' was built under R version 3.5.3
event <- tibble(id = c("00_1", "00_2", "00_3", "00_4", "00_5", "00_6", "00_7"),
type_id = c("A", "B", "C", "B", "A", "B", "C"))
detail <- tibble(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
event_id = c("00_1", "00_1", "00_2", "00_2", "00_3", "00_4", "00_4", "00_5", "00_6", "00_6", "00_7", "00_8"),
type_id = c(3L, 4L, 6L, 7L, 2L, 6L, 3L, 2L, 6L, 5L, 2L, 1L))
event_f <- event %>%
semi_join(detail %>% filter(event_id %in% event$id,
type_id == 6,
type_id != (7 | 3)), by = c("id" = "event_id"))
由 reprex package (v0.2.1)
于 2019-04-01 创建
我想要一个包含一行的 df:id = "00_6"
和 type_id = "B"
。我想问题出在最后两个 filter()
操作,但不确定如何组合它们?
我觉得你需要
library(dplyr)
event %>%
semi_join(detail %>%
group_by(event_id) %>%
filter(any(type_id == 6) & all(!type_id %in% c(3, 7))),
by = c("id" = "event_id"))
# id type_id
# <chr> <chr>
#1 00_6 B
因为我们正试图找出那些 type_id
的 event_id
满足我们需要 group_by
event_id
的标准。如果我们不 group_by
那么过滤条件将应用于整个数据框,而不是 return 0 行,因为我们在数据框中有值 3 和 7。
我试图通过创建一个名为 event_f
的 df
来完成下面描述的操作。
我想从 detail
df
作为过滤条件,所有具有 type_id == 6
的 event_id
不包括 6 和 3 或 6 和 7 的组合。
请注意,可以有其他组合,但它们都将包含在内。
library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.5.3
#> Warning: package 'purrr' was built under R version 3.5.3
event <- tibble(id = c("00_1", "00_2", "00_3", "00_4", "00_5", "00_6", "00_7"),
type_id = c("A", "B", "C", "B", "A", "B", "C"))
detail <- tibble(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
event_id = c("00_1", "00_1", "00_2", "00_2", "00_3", "00_4", "00_4", "00_5", "00_6", "00_6", "00_7", "00_8"),
type_id = c(3L, 4L, 6L, 7L, 2L, 6L, 3L, 2L, 6L, 5L, 2L, 1L))
event_f <- event %>%
semi_join(detail %>% filter(event_id %in% event$id,
type_id == 6,
type_id != (7 | 3)), by = c("id" = "event_id"))
由 reprex package (v0.2.1)
于 2019-04-01 创建我想要一个包含一行的 df:id = "00_6"
和 type_id = "B"
。我想问题出在最后两个 filter()
操作,但不确定如何组合它们?
我觉得你需要
library(dplyr)
event %>%
semi_join(detail %>%
group_by(event_id) %>%
filter(any(type_id == 6) & all(!type_id %in% c(3, 7))),
by = c("id" = "event_id"))
# id type_id
# <chr> <chr>
#1 00_6 B
因为我们正试图找出那些 type_id
的 event_id
满足我们需要 group_by
event_id
的标准。如果我们不 group_by
那么过滤条件将应用于整个数据框,而不是 return 0 行,因为我们在数据框中有值 3 和 7。