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')