获得与符合条件的组中最接近的前一行的差异

时间:2018-11-14 18:44:05

标签: r

我正在尝试为每一行计算与属于同一组且符合特定条件的最接近的前一行的差异。

假设我具有以下数据框:

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 :(得分:0)

这里是tidyverse的一个选项。将'Day'转换为Date类,按{Patient'将arrange转换为“ Day”,按“ Patient”分组,得到相邻“ Day”的差值,然后根据在“已接受”中出现“是”,并取“ 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