Фильтрация строк по нескольким условиям с использованием dplyr - PullRequest
0 голосов
/ 03 июня 2018
df <- data.frame(loc.id = rep(1:2,each = 10), threshold = rep(1:10,times = 2))

Я хочу отфильтровать первые строки, когда threshold> = 2 и threshold равно> = 4 для каждого loc.id.Я сделал это:

df %>% group_by(loc.id) %>% dplyr::filter(row_number() == which.max(threshold >= 2),row_number() == which.max(threshold >= 4))

Я ожидал такой фрейм данных:

      loc.id threshold
        1       2
        1       4
        2       2
        2       4

Но он возвращает мне пустой фрейм данных

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Если это не то, что вам нужно, присвойте df ниже имени и используйте его для фильтрации вашего набора данных.

df %>% 
  distinct() %>% 
  filter(threshold ==2 | threshold==4)
#>   loc.id threshold
#> 1      1         2
#> 2      1         4
#> 3      2         2
#> 4      2         4
```
0 голосов
/ 03 июня 2018

Исходя из условия, мы можем slice строк из конкатенации двух индексов which.max, получить unique (если есть только случаи, когда порог больше 4, тогда оба условия получают одинаковый индекс)

df %>%
    group_by(loc.id) %>%
    filter(any(threshold >= 2)) %>% # additional check
    #slice(unique(c(which.max(threshold > 2), which.max(threshold > 4))))
    # based on the expected output
    slice(unique(c(which.max(threshold >= 2), which.max(threshold >= 4))))
# A tibble: 4 x 2
# Groups:   loc.id [2]
#  loc.id threshold
#   <int>     <int>
#1      1         2
#2      1         4
#3      2         2
#4      2         4

Обратите внимание, что могут быть группы, в которых нет значений в пороге, большем или равном 2. Мы можем оставить только эти группы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...