Пример данных:
y <- c(sort(sample(0:100, 365,replace = T)),sort(sample(0:100, 365,replace = T)))
df <- data.frame(loc.id = rep(1:2,each = 365), day = rep(1:365,times = 2), y = y,ref.day = 250)
Я хочу выбрать все первые строки, где y> 20, y> 40, y> 60 и y> 80 для каждого loc.id
df %>% group_by(loc.id) %>% dplyr::filter(any(y > 20)) %>% # additional check
dplyr::slice(unique(c(which.max(y > 20), which.max(y > 40),which.max(y > 60),which.max(y > 80)))) %>% ungroup()
# A tibble: 8 x 4
loc.id day y ref.day
<int> <int> <int> <dbl>
1 1 78 21 250
2 1 154 41 250
3 1 225 61 250
4 1 288 81 250
5 2 79 21 250
6 2 147 41 250
7 2 224 61 250
8 2 300 81 250
Я хочу включить дополнительный оператор, который заключается в том, что если после нарезки day
будет> ref.day
, тогда выберите строку, в которой день равен ref.day.В этом случае это будет выглядеть так:
# A tibble: 8 x 4
loc.id day y ref.day
<int> <int> <int> <dbl>
1 1 78 21 250
2 1 154 41 250
3 1 225 61 250
4 1 288 81 250 # this row will not be selected. Instead row where day == 250 will be here instead
5 2 79 21 250
6 2 147 41 250
7 2 224 61 250
8 2 300 81 250 # this row will not be selected. Instead row where day == 250 will be here instead