функция для данных о событиях в r - PullRequest
0 голосов
/ 18 марта 2020

У меня есть набор данных пациента, мне нужно отбросить строки после первого появления столбца болезни. например

ID    Date    Disease
123 02-03-2012  0
123 03-03-2013  1
123 04-03-2014  0
321 03-03-2015  1
423 06-06-2016  1
423 07-06-2017  1
543 08-05-2018  1
543 09-06-2019  0
645 08-09-2019  0

и ожидаемый результат, который я хочу

ID    Date     Disease
123 02-03-2012  0
123 03-03-2013  1
321 03-03-2015  1
423 06-06-2016  1
543 08-05-2018  1

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Понятия не имею, почему в ожидаемом результате нет последней строки 645 08-09-2019 0. Первое появление столбца болезней для идентификатора 645 еще не появилось, поэтому я полагаю, что вы, возможно, пропустили его в ожидаемом результате.

Исходя из моих предположений выше, возможно, вы можете попробовать базовое решение R ниже, используя subset + ave

dfout <- subset(df,!!ave(Disease,ID,FUN = function(v) !duplicated(cumsum(v)>0)))

таким, что

> dfout
   ID       Date Disease
1 123 02-03-2012       0
2 123 03-03-2013       1
4 321 03-03-2015       1
5 423 06-06-2016       1
7 543 08-05-2018       1
9 645 08-09-2019       0

ДАННЫЕ

df <- structure(list(ID = c(123L, 123L, 123L, 321L, 423L, 423L, 543L, 
543L, 645L), Date = c("02-03-2012", "03-03-2013", "04-03-2014", 
"03-03-2015", "06-06-2016", "07-06-2017", "08-05-2018", "09-06-2019", 
"08-09-2019"), Disease = c(0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L
)), class = "data.frame", row.names = c(NA, -9L))
0 голосов
/ 18 марта 2020

В одну сторону с dplyr выберите строки до первого появления 1 для каждого ID.

library(dplyr)

df %>% group_by(ID) %>% filter(row_number() <= which(Disease == 1)[1])


#    ID  Date        Disease
#  <int> <fct>        <int>
#1   123 02-03-2012       0
#2   123 03-03-2013       1
#3   321 03-03-2015       1
#4   423 06-06-2016       1
#5   543 08-05-2018       1

Мы также можем использовать slice

df %>% group_by(ID) %>% slice(if(any(Disease == 1)) 1:which.max(Disease) else 0)

данные

df <- structure(list(ID = c(123L, 123L, 123L, 321L, 423L, 423L, 543L, 
543L, 645L), Date = structure(c(1L, 2L, 4L, 3L, 5L, 6L, 7L, 9L, 
8L), .Label = c("02-03-2012", "03-03-2013", "03-03-2015", "04-03-2014", 
"06-06-2016", "07-06-2017", "08-05-2018", "08-09-2019", "09-06-2019"
), class = "factor"), Disease = c(0L, 1L, 0L, 1L, 1L, 1L, 1L, 
0L, 0L)), class = "data.frame", row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...