tjebo
tjebo

Reputation: 23727

Filter and return all rows of a group where specific row fulfills one condition

I am looking to filter and retrieve all rows from all groups where a specific row meets a condition, in my example when the value is more than 3 at the highest day per group. This is obviously simplified but breaks it down to the essential.

# Dummy data
id = rep(letters[1:3], each =  3)
day = rep(1:3, 3)
value = c(2,3,4,2,3,3,1,2,4)
my_data = data.frame(id, day, value, stringsAsFactors = FALSE)

My approach works, but it seems somewhat unsmart:

require(dplyr)
foo <- my_data %>%
         group_by(id) %>% 
         slice(which.max(day)) %>% # gets the highest day
         filter(value>3)           # filters the rows with value >3

## semi_join with the original data frame gives the required result: 

semi_join(my_data, foo, by = 'id')
  id day value
1  a   1     2
2  a   2     3
3  a   3     4
4  c   1     1
5  c   2     2
6  c   3     4

Is there a more succint way to do this?

Upvotes: 1

Views: 66

Answers (1)

Relasta
Relasta

Reputation: 1106

my_data %>% group_by(id) %>% filter(value[which.max(day)] > 3)

Upvotes: 3

Related Questions