Фильтр dplyr с несколькими условиями и ИЛИ - PullRequest
1 голос
/ 23 мая 2019

У меня есть большой кусок, который мне нужно отфильтровать.В частности, мне нужно отфильтровать различные комбинации нескольких условий (но все из одних и тех же столбцов).

Мои условия фильтрации - это что-то вроде

  filter(str_detect(id, "^M.+(KIT|FLEECE)"), between(f1, 300, 400),  between(f2, 1300, 1400))
 filter(str_detect(id, "^M.+(GOOSE)"), between(f1, 200, 350),  between(f2, 1200, 1400))

Что, конечно, работает, это что-то вроде

filtered1<- df %>%
  filter(str_detect(id, "^M.+(KIT|FLEECE)"), between(f1, 300, 400),  between(f2, 1300, 1400))
filtered2<- df %>%
  filter(str_detect(id, "^M.+(GOOSE)"), between(f1, 200, 350),  between(f2, 1200, 1400))
filtered<-bind_rows(filtered1, filtered2)     

Мне интересно, как бы я сочетал их с каким-то оператором ИЛИ, например

  filtered<- df %>%
    filter(str_detect(id, "^M.+(KIT|FLEECE)"), between(f1, 300, 400),  between(f2, 1300, 1400)) OR
    filter(str_detect(id, "^M.+(GOOSE)"), between(f1, 200, 350),  between(f2, 1200, 1400))

Вот MWE некоторых примеров данных

id<-rep(c("M1_1_KIT_1", "M3_2_FLEECE_2", "M2_4_GOOSE_3", "M6_4_KIT_5"), 3)
f1<-sample(200:500, 12)
f2<-sample(1200:1500, 12)
df<-data.frame(id, f1, f2)
df

          id  f1   f2
1     M1_KIT 268 1238
2  M3_FLEECE 270 1459
3   M2_GOOSE 409 1471
4     M4_KIT 344 1337
5     M1_KIT 400 1419
6  M3_FLEECE 210 1379
7   M2_GOOSE 321 1356
8     M4_KIT 478 1284
9     M1_KIT 391 1439
10 M3_FLEECE 382 1317
11  M2_GOOSE 468 1273
12    M4_KIT 306 1270

Я быбыть еще более счастливым для более общего решения, например, когда я помещаю значения фильтра в отдельный тиббл и перебираю строки, но это вне моего знания R.

1 Ответ

0 голосов
/ 23 мая 2019

Вы можете поместить их в скобки, используя &, а затем использовать трубу | для обозначения "или"

df %>%
  filter(
    (str_detect(id, "^M.+(KIT|FLEECE)") & between(f1, 300, 400) & between(f2, 1300, 1400)) |
    (str_detect(id, "^M.+(GOOSE)") & between(f1, 200, 350) & between(f2, 1200, 1400))
  )

...