使用 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)))