[英]Keep all rows up to a specific value in R using dplyr
我有生存分析数据,但不幸的是事件本身并不是死亡。 (好吧,幸运的是数据集中的人)。
这意味着某人可能会在数据集中停留的时间超过他们的事件。 由于先前的 StackExchange 问题,我已经弄清楚了如何创建一个在事件第一次发生时返回TRUE
的列。
但现在我想删除所有未来发生的事件——也就是说,我想右审查。
例如,这段代码
mtcars %>%
select(cyl, carb) %>%
group_by(cyl) %>%
mutate(first_4 = carb == 4 & !duplicated(carb == 4)) %>%
arrange(cyl)
给我
cyl carb first_4
1 4 1 FALSE
2 4 2 FALSE
3 4 2 FALSE
4 4 1 FALSE
5 4 2 FALSE
6 4 1 FALSE
7 4 1 FALSE
8 4 1 FALSE
9 4 2 FALSE
10 4 2 FALSE
11 4 2 FALSE
12 6 4 TRUE
13 6 4 FALSE
14 6 1 FALSE
15 6 1 FALSE
16 6 4 FALSE
17 6 4 FALSE
18 6 6 FALSE
19 8 2 FALSE
20 8 4 TRUE
21 8 3 FALSE
22 8 3 FALSE
23 8 3 FALSE
24 8 4 FALSE
25 8 4 FALSE
26 8 4 FALSE
27 8 2 FALSE
28 8 2 FALSE
29 8 4 FALSE
30 8 2 FALSE
31 8 4 FALSE
32 8 8 FALSE
到目前为止,一切都很好。 但是,我想要做的是保留 TRUE之前的所有行并删除它之后的所有行,每个组,IFF TRUE
完全显示在该组中。 因此,我的最终数据集将如下所示:
cyl carb first_4
1 4 1 FALSE
2 4 2 FALSE
3 4 2 FALSE
4 4 1 FALSE
5 4 2 FALSE
6 4 1 FALSE
7 4 1 FALSE
8 4 1 FALSE
9 4 2 FALSE
10 4 2 FALSE
11 4 2 FALSE
12 6 4 TRUE
13 8 2 FALSE
14 8 4 TRUE
我们可以在最后添加一个filter
library(dplyr)
mtcars %>%
select(cyl, carb) %>%
group_by(cyl) %>%
mutate(first_4 = carb == 4 & !duplicated(carb == 4)) %>%
arrange(cyl) %>%
filter(cumsum(cumsum(first_4)) < 2)
# A tibble: 14 x 3
# Groups: cyl [3]
# cyl carb first_4
# <dbl> <dbl> <lgl>
# 1 4 1 FALSE
# 2 4 2 FALSE
# 3 4 2 FALSE
# 4 4 1 FALSE
# 5 4 2 FALSE
# 6 4 1 FALSE
# 7 4 1 FALSE
# 8 4 1 FALSE
# 9 4 2 FALSE
#10 4 2 FALSE
#11 4 2 FALSE
#12 6 4 TRUE
#13 8 2 FALSE
#14 8 4 TRUE
或者另一种选择是slice
%>%
slice(if(!any(first_4)) row_number() else seq_len(which.max(first_4)))
我们可以使用which
在每个组中第一次出现TRUE
,如果它不存在,则 select 组中的所有行号。
library(dplyr)
mtcars %>%
select(cyl, carb) %>%
group_by(cyl) %>%
mutate(first_4 = carb == 4 & !duplicated(carb == 4)) %>%
arrange(cyl) %>%
slice(seq_len(min(which(first_4), n(), na.rm = TRUE)))
# cyl carb first_4
# <dbl> <dbl> <lgl>
# 1 4 1 FALSE
# 2 4 2 FALSE
# 3 4 2 FALSE
# 4 4 1 FALSE
# 5 4 2 FALSE
# 6 4 1 FALSE
# 7 4 1 FALSE
# 8 4 1 FALSE
# 9 4 2 FALSE
#10 4 2 FALSE
#11 4 2 FALSE
#12 6 4 TRUE
#13 8 2 FALSE
#14 8 4 TRUE
与match
类似:
slice(seq_len(min(match(TRUE, first_4), n(), na.rm = TRUE)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.