根据多个条件过滤行

时间:2020-07-12 22:23:52

标签: r dplyr subset

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))))

它返回空行。

2 个答案:

答案 0 :(得分:1)

这是您正在寻找的东西还是您的预期输出是什么样子?在下面的示例中,如果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

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

答案 1 :(得分:0)

您可以按照创建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