R: Длинные данные: как удалить все следующие объекты в одном и том же идентификаторе, если условие выполнено?

У меня есть длинные данные, например, такие:

ID   time   condition
1    1       0
1    2       0
1    3       0
1    4       1
2    1       0 
2    2       1
2    3       1
2    4       0
3    1       1
3    2       1
3    3       0
3    4       0
4    1       0
4    2       1 
4    3       NA
4    4       NA

Я хочу сохранить эти строки только до того, как условие будет выполнено один раз, поэтому я хочу:

ID   time   condition
1    1       0
1    2       0
1    3       0
1    4       1
2    1       0 
2    2       1
3    1       1
4    1       0
4    2       1

Я пытался зациклить, но а) он сказал, что зацикливание не является хорошим стилем кодирования в R и б) оно не будет работать. Примечание: просто если вам интересно, имеет смысл, что идентификаторы имеют условие, а затем снова теряют его в моем примере, но меня интересует только то, когда они впервые появились.
Спасибо.

1 ответ

Решение

Вот простой способ с dplyr:

library(dplyr)
df %>% group_by(ID) %>%
  filter(row_number() <= which.max(condition) | sum(condition) == 0)
# # A tibble: 7 x 3
# # Groups:   ID [3]
#      ID  time condition
#   <int> <int>     <int>
# 1     1     1         0
# 2     1     2         0
# 3     1     3         0
# 4     1     4         1
# 5     2     1         0
# 6     2     2         1
# 7     3     1         1

Опирается на which.max который возвращает индекс первого максимального значения в векторе. | sum(condition) == 0 заботится о сохранении цензуры (где условие всегда 0).

Используя эти данные:

1    1       0
1    2       0
1    3       0
1    4       1
2    1       0 
2    2       1
2    3       1
2    4       0
3    1       1
3    2       1
3    3       0
3    4       0')
Другие вопросы по тегам