计算长数据的时间间隔

时间:2019-05-23 15:58:37

标签: r

我正在考虑构造一个周期性事件生存分析,并且正在努力研究如何计算事件之间的时间间隔。我的数据格式很长,每一行都指示医院发作和发作的年龄(以月为单位)。 我的问题是,为了进行分析,我需要为每个参与者计算情节之间的时间。我意识到这可能仅涉及在参与者之间循环/迭代,但是我无法弄清楚如何获得每个参与者中事件n和n-1之间的时间。

我找到了上一个问题Date-time differences between rows in R 这部分地回答了我的问题,但是对于任何事件,对于每个参与者来说,对于每个参与者,事件数量都不相同的多个事件如何实现,都没有任何想法。

            [ID] [age_of_hosp]
    [1,] 3600001  872
    [2,] 3600001  874
    [3,] 3600001  868
    [4,] 3600001  882
    [5,] 3600001  873
    [6,] 3600001  870
    [7,] 3600001  869
    [8,] 3600001  562
    [9,] 3600001  871
   [10,] 3600001  873
   [11,] 3600001  885
   [12,] 3600001  868
   [13,] 3600001  852
   [14,] 3600001  887
   [15,] 3600001  885
   [16,] 3600001  887
   [17,] 3600001  853
   [18,] 3600001  617
   [19,] 3600001  885
   [20,] 3600001  874
   [21,] 3600001  617
   [22,] 3600001  871
   [23,] 3600001  851
   [24,] 3600002   NA
   [25,] 3600003   NA
   [26,] 3600004  865
   [27,] 3600005  655
   [28,] 3600005  667
   [29,] 3600005  656
   [30,] 3600005  664
   [31,] 3600006  814
   [32,] 3600006  821
   [33,] 3600006  821
   [34,] 3600006  755
   [35,] 3600006  813

任何建议或指点都会很棒!

1 个答案:

答案 0 :(得分:1)

如果您愿意使用tibble受欢迎的dplyr组软件包中的tidyverseR之类的软件包来解决方案,则可以尝试以下方法:

首先,使用tribble函数重新创建数据:

library(tibble)
ages <- tribble(
      ~id, ~age_of_hosp,
  3600001,          872,
  3600001,          874,
  3600001,          868,
  3600001,          882,
  3600001,          873,
  3600001,          870,
  3600001,          869,
  3600001,          562,
  3600001,          871,
  3600001,          873,
  3600001,          885,
  3600001,          868,
  3600001,          852,
  3600001,          887,
  3600001,          885,
  3600001,          887,
  3600001,          853,
  3600001,          617,
  3600001,          885,
  3600001,          874,
  3600001,          617,
  3600001,          871,
  3600001,          851,
  3600002,           NA,
  3600003,           NA,
  3600004,          865,
  3600005,          655,
  3600005,          667,
  3600005,          656,
  3600005,          664,
  3600006,          814,
  3600006,          821,
  3600006,          821,
  3600006,          755,
  3600006,          813
)

然后开始工作:

  • 您在下面寻找的功能仅为lag。它找到先前的值。而且,如果您不熟悉管道运算符(%>%),它将采用上一个函数的结果并将其“管道”到下一个函数中。
  • 首先,我过滤了NA条记录。不知道您想怎么做。
  • 然后我按身份证号和医院的年龄来安排,以防万一他们没有按这个顺序安排。
  • id分组可以确保当我们使用滞后时,我们获得该事件的最后记录 ,而不仅仅是整个记录。
  • mutate修改字段或创建新字段。在这里,我用它来创建一个last_incident_age字段,然后右转并使用它来获取以月为单位的时差。
  • glimpse只是查看结果数据集的一种好方法。 ;)
library(dplyr)
ages %>% 
  filter(!is.na(age_of_hosp)) %>% 
  arrange(id, age_of_hosp) %>% 
  group_by(id) %>% 
  mutate(
    last_incident_age = lag(age_of_hosp, 1, default = NA),
    months_since_last = age_of_hosp - last_incident_age
  ) %>% 
  glimpse()