繁体   English   中英

使用 dplyr 将所有行保持在 R 中的特定值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM