Reputation: 1539
Based on this data:
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
How can I filter out groups (grp
) that have a negative value in either var1
or (or both) var2
columns only when wave
is between 1 and 2. Using this data, only data of group c would be returned. I tried something like the folowing, but no succes.
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".
Created on 2020-10-29 by the reprex package (v0.3.0.9001)
Upvotes: 1
Views: 78
Reputation: 11548
Does this work:
> library(dplyr)
> df %>% group_by(grp) %>% filter(!any((var1<0|var2<0) & 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
>
Upvotes: 1