Фильтрация по нескольким столбцам

#r #dplyr

#r #dplyr

Вопрос:

На основе этих данных:

 library(tidyverse)

df <- tibble(
  grp = rep(c("a", "b", "c"), each = 3),
  wave = rep(1:3, times = 3),
  var1 = c(1, -2, 3, 4, 5, 1, 1, 4, -5),
  var2 = c(-1, 2, 3, -4, 5, 6, 1, 4, 5)
)

df
#> # A tibble: 9 x 4
#>   grp    wave  var1  var2
#>   <chr> <int> <dbl> <dbl>
#> 1 a         1     1    -1
#> 2 a         2    -2     2
#> 3 a         3     3     3
#> 4 b         1     4    -4
#> 5 b         2     5     5
#> 6 b         3     1     6
#> 7 c         1     1     1
#> 8 c         2     4     4
#> 9 c         3    -5     5
  

Как я могу отфильтровать groups ( grp ), которые имеют отрицательное значение в одном var1 или (или обоих) var2 столбцах, только когда wave оно находится между 1 и 2. Используя эти данные, будут возвращены только данные группы c. Я попробовал что-то вроде следующего, но безуспешно.

 df %>%
  group_by(grp) %>%
  filter(across(contains("var"), ~ .x[between(wave, 1, 2)] > 0))
#> Error: Problem with `filter()` input `..1`.
#> x Input `..1` must be of size 3 or 1, not size 2.
#> ℹ Input `..1` is `across(contains("var"), ~.x[between(wave, 1, 2)] > 0)`.
#> ℹ The error occurred in group 1: grp = "a".
  

Создано 2020-10-29 пакетом reprex (версия 0.3.0.9001)

Ответ №1:

Работает ли это:

 > library(dplyr)
> df %>% group_by(grp) %>% filter(!any((var1<0|var2<0) amp; between(wave,1,2)))
# A tibble: 3 x 4
# Groups:   grp [1]
  grp    wave  var1  var2
  <chr> <int> <dbl> <dbl>
1 c         1     1     1
2 c         2     4     4
3 c         3    -5     5
>