使用 dplyr 将所有行保持在 R 中的特定值
Keep all rows up to a specific value in R using dplyr
我有生存分析数据,但不幸的是事件本身并不是死亡。 (好吧,幸运的是数据集中的人)。
这意味着某人在数据集中的停留时间可能比他们的事件更长。由于先前的 StackExchange 问题,我已经弄清楚如何为事件的第一次出现创建 returns 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
到目前为止,还不错。然而,我想做的是保留所有行 before 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)))
我有生存分析数据,但不幸的是事件本身并不是死亡。 (好吧,幸运的是数据集中的人)。
这意味着某人在数据集中的停留时间可能比他们的事件更长。由于先前的 StackExchange 问题,我已经弄清楚如何为事件的第一次出现创建 returns 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
到目前为止,还不错。然而,我想做的是保留所有行 before 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)))