【问题标题】:filter rows based on multiple conditions根据多个条件过滤行
【发布时间】:2020-07-12 22:23:52
【问题描述】:
dat <- data.frame(id = c(0, 0, 01, 02, 03, 011, 012, 013, 0111, 0112, 0113),
                  x1 = rnorm(11), 
                  x2 = rnorm(11),
                  x3 = rnorm(11))


my.df <- data.frame(id = 0, id1 = 01, id2 = 011, id3 = 0111, some.column = 'xyz')

我想使用以下条件过滤来自dat 的行:

如果my.df$id3 存在于dat$id 中,则过滤dat$id == my.df$id3,否则 检查my.df$id2 是否存在并过滤dat$id == my.df$id2,如果不存在, 检查my.df$id1 是否存在并过滤dat$id == my.df$id1,如果不存在 只需过滤dat$id == my.df$id

dat %>% 
dplyr::filter(ifelse(my.df$id3 %in% id, id == my.df$id3, 
              ifelse(my.df$id2 %in% id, id == my.df$id2,
              ifelse(my.df$id1 %in% id, id == my.df$id1, id == my.df$id))))

它返回空行。

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    这是您正在寻找的还是您的预期输出是什么样的?在下面的示例中,如果my.df$id3 存在于dat$id 中,则应用过滤器id == my.df$id3。既然是这种情况,这个过滤器只会留下一行原始数据。

    library(dplyr)
    
    dat <- data.frame(id = c(0, 0, 01, 02, 03, 011, 012, 013, 0111, 0112, 0113),
                      x1 = rnorm(11), 
                      x2 = rnorm(11),
                      x3 = rnorm(11))
    
    
    my.df <- data.frame(id = 0, id1 = 01, id2 = 011, id3 = 0111, some.column = 'xyz')
    
    dat %>% 
      dplyr::filter(if (my.df$id3 %in% id) {
                      id == my.df$id3
                    } else if (my.df$id2 %in% id) {
                      id == my.df$id2
                    } else if (my.df$id1 %in% id) {
                      id == my.df$id1 })
    #>    id        x1         x2         x3
    #> 1 111 0.3771992 -0.5073165 -0.3555985
    

    reprex package (v0.3.0) 于 2020-07-13 创建

    【讨论】:

    • 是的。我希望返回一行。这是正确的
    【解决方案2】:

    您可以提取my.df 中的列值以创建order_vec,过滤其中存在的值,arrange 中的值并选择第一行。

    library(dplyr)
    
    order_vec <- unlist(my.df[c(paste0('id', 3:1), 'id')])
    
    dat %>%
      filter(id %in% order_vec) %>%
      arrange(match(id, order_vec)) %>%
      slice(1L)
    
    #   id  x1    x2    x3
    #1 111 1.5 0.872 0.848
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2017-08-03
      • 2022-08-18
      • 1970-01-01
      • 2013-09-06
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多