【问题标题】:multiple criteria filtering join using dplyr使用 dplyr 过滤连接的多个条件
【发布时间】:2019-04-01 09:32:30
【问题描述】:

我正在尝试通过创建一个名为event_fdf 来完成下面描述的操作。

我想从detaildf作为过滤条件,所有event_id具有type_id == 6,不包括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() 操作,但不确定如何组合它们?

【问题讨论】:

    标签: r dplyr dbplyr


    【解决方案1】:

    我认为你需要

    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     
    

    当我们试图找出满足group_byevent_id 所需条件的type_idevent_ids。如果我们不group_by,那么过滤条件将应用于整个数据帧,而不是返回 0 行,因为我们在数据帧中有值 3 和 7。

    【讨论】:

    • 太好了,谢谢。您介意在此处解释为什么需要group_by 吗?
    • @MattnDo 用一些解释更新了答案。
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2019-09-21
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多