【问题标题】:Calculating time intervals for long data计算长数据的时间间隔
【发布时间】:2019-05-23 15:58:37
【问题描述】:

我正在研究构建周期性事件生存分析,并且正在努力研究如何计算事件之间的时间间隔。我的数据是长格式的,每一行都表示医院发作和发作的年龄(以月为单位)。 我的问题是,为了进行分析,我需要为每个参与者计算剧集之间的时间。我意识到这可能涉及简单地在参与者之间循环/迭代,但我无法弄清楚如何在每个参与者中获取事件 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

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

【问题讨论】:

  • 最好将答案标记为已接受,以便未来的 Google 员工能够找到它并鼓励那些花时间回答的人。另外,如果您有任何问题需要澄清答案,请尽管提问!
  • A) Benjamin:要求勾选标记被认为是一种糟糕的形式。 (B)同样的事情可以说你没有支持这个问题。)
  • @42,我为什么要投票赞成这个问题?

标签: r


【解决方案1】:

如果您愿意使用 tibbledplyr 等广受欢迎的 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。它找到以前的值。如果您不熟悉管道运算符 (%&gt;%),它会将前一个函数的结果“通过管道”传递给下一个函数。
  • 首先我过滤掉了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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2012-08-14
    • 2018-07-08
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多