0

I have this data frame:

`dat <- data.frame(date = c("2017-02-23", "2017-02-22", "2017-02-15", "2017-02-05","2018-05-23", "2018-02-22"), grp = c(1,1,6,7,7,7), 
var2 = c(1,3,18,15,25,5))`

I would like to have all the rows of each group (grp) when value of var2>=14

Expected results:

    dat <- data.frame(date = c("2017-02-15", "2017-02-05","2018-05-23", 
"2018-02-22"), grp = c(6,7,7,7), var2 = c(18,15,25,5))
s157
  • 453
  • 4
  • 10

2 Answers2

3

We can use any in filter after grouping by 'grp'

library(dplyr)
dat %>%
    group_by(grp) %>% 
    filter(any(var2 >= 14))
# A tibble: 4 x 3
# Groups:   grp [2]
#  date         grp  var2
#  <fct>      <dbl> <dbl>
#1 2017-02-15     6    18
#2 2017-02-05     7    15
#3 2018-05-23     7    25
#4 2018-02-22     7     5

Or with all on reverse logic

dat %>% 
   group_by(grp) %>% 
   filter(!all(var2 < 14))

In base R, this can be done with ave to create a logical vector for subsetting the rows

dat[with(dat, ave(var2 >= 14, grp, FUN = any)),]
akrun
  • 874,273
  • 37
  • 540
  • 662
2

Maybe without groupby , with base R

dat[dat$grp %in% dat$grp [dat$var2 >= 14],]
        date grp var2
3 2017-02-15   6   18
4 2017-02-05   7   15
5 2018-05-23   7   25
6 2018-02-22   7    5
BENY
  • 317,841
  • 20
  • 164
  • 234