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