Получить разницу с ближайшим предыдущим рядом в группе, которая соответствует критерию - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь для каждой строки рассчитать разницу с ближайшей предыдущей строкой, принадлежащей к той же группе, которая соответствует определенному критерию.

Предположим, у меня есть следующий фрейм данных:

s <- read.table(text = "Visit_num Patient Day Admitted
1 1 2015/01/01 Yes
2 1 2015/01/10 No         
3 1 2015/01/15 Yes
4 1 2015/02/10 No                                       
5 1 2015/03/08 Yes
6 2 2015/01/01 Yes                                       
7 2 2015/04/01 No
8 2 2015/04/10 No
9 3 2015/04/01 No
10 3 2015/04/10 No", header = T, sep = "")

Для каждого Visit_num и для каждого пациента я хотел бы получить разницу с ближайшей строкой, в которую пациент был принят (т. Е. Да). Примечание столбец день упорядочен по дням, и единица времени для этого примера - дни. Вот как я хотел, чтобы мой фрейм данных выглядел так:

Visit_num Patient   Day      Admitted  Diff_days
   1        1    2015/01/01    Yes     NA
   2        1    2015/01/10     No     9
   3        1    2015/01/15    Yes     14
   4        1    2015/02/10     No     26
   5        1    2015/03/08    Yes     52
   6        2    2015/01/01    Yes     NA
   7        2    2015/04/01     No     90
   8        2    2015/04/10     No     99
   9        3    2015/04/01     No     NA
   10       3    2015/04/10     No     NA

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 ноября 2018

Вот вариант с tidyverse.Преобразуйте 'Day' в Date class, arrange в 'Patient', 'Day', сгруппированные по 'Patient', получите разницу между смежными 'Day', создайте группу 'grp', основываясь на появлении 'Yes'в' Допущен 'и возьмите совокупную сумму' Diff_days '

library(tidyverse)
s %>%
    mutate(Day = ymd(Day)) %>%
    arrange(Patient, Day) %>% 
    group_by(Patient) %>% 
    mutate(Diff_days = c(NA, diff(Day))) %>% 
    group_by(grp = cumsum(lag(Admitted == "Yes", default = TRUE)), add = TRUE) %>%         
    mutate(Diff_days = cumsum(replace_na(Diff_days, 0))) %>%
    ungroup %>%
    select(-grp) %>%
    mutate(Diff_days = na_if(Diff_days, 0))
# A tibble: 8 x 5
#  Visit_num Patient Day        Admitted Diff_days
#      <int>   <int> <date>     <fct>        <dbl>
#1         1       1 2015-01-01 Yes             NA
#2         2       1 2015-01-10 No               9
#3         3       1 2015-01-15 Yes             14
#4         4       1 2015-02-10 No              26
#5         5       1 2015-03-08 Yes             52
#6         6       2 2015-01-01 Yes             NA
#7         7       2 2015-04-01 No              90
#8         8       2 2015-04-10 No              99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...