Philippe Massicotte
Philippe Massicotte

Reputation: 1539

Filtering across multiple columns

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

Answers (1)

Karthik S
Karthik S

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

Related Questions