代码之家  ›  专栏  ›  技术社区  ›  89_Simple

基于多个条件筛选行[重复]

  •  0
  • 89_Simple  · 技术社区  · 4 年前
    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))))
    

    它返回空行。

    1 回复  |  直到 4 年前
        1
  •  1
  •   TimTeaFan    4 年前

    这就是你想要的吗?或者你的预期产出是什么样的?在下面的示例中 id == my.df$id3 如果 my.df$id3 存在于 dat$id .由于是这种情况,此筛选器只保留一行原始数据。

    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
    

    于2020年7月13日由 reprex package (v0.3.0)

        2
  •  0
  •   Ronak Shah    4 年前

    可以在中提取列值 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