R:长数据:如何在满足条件后删除同一 ID 内的所有后续对象?
R: Long-data: how to remove all following obs within same ID once condition is met?
我有长数据,例如:
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
我尝试循环,但 a) 它说循环在 R 中不是好的编码风格,b) 它不起作用。
旁注:如果你想知道,在我的例子中 ID 有条件然后又失去它确实有意义,但我只对他们第一次拥有它感兴趣。
谢谢。
这是 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
,其中returns向量中第一个最大值的索引。 | 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')
我有长数据,例如:
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
我尝试循环,但 a) 它说循环在 R 中不是好的编码风格,b) 它不起作用。
旁注:如果你想知道,在我的例子中 ID 有条件然后又失去它确实有意义,但我只对他们第一次拥有它感兴趣。
谢谢。
这是 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
,其中returns向量中第一个最大值的索引。 | 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')