Держите все строки до указанного значения c в R, используя dplyr - PullRequest
2 голосов
/ 05 апреля 2020

У меня есть данные анализа выживания, но, к сожалению, само событие не является смертью. (К счастью для людей из набора данных).

Это означает, что кто-то может оставаться в наборе данных дольше, чем их событие. Благодаря предыдущему вопросу 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

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Мы можем добавить 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)))
2 голосов
/ 05 апреля 2020

Мы можем использовать which, чтобы получить первое вхождение TRUE в каждой группе, а если его нет, то выбрать все номера строк в группе.

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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...