фильтровать строки на основе нескольких условий - PullRequest
0 голосов
/ 13 июля 2020
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 ]

1 голос
/ 13 июля 2020

Это то, что вы ищете или как выглядит ваш ожидаемый результат? В приведенном ниже примере фильтр 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

Создано 13 июля 2020 г. пакетом REPEX (v0.3.0 )

0 голосов
/ 13 июля 2020

Вы можете извлечь значения столбцов в 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
...