【问题标题】:Identify gaps in a continuous time period识别连续时间段内的差距
【发布时间】:2013-11-19 05:38:33
【问题描述】:

我有一个数据框,其中包含一些关于何时将线附加到 ID 的观察结果。 我需要每个 ID 连接线/导管的天数。

这是我的输出返回:

structure(list(ID = c(487622L, 487622L, 487639L, 487639L, 489027L, 
489027L, 489027L, 491858L, 491858L, 491858L, 491858L, 491858L, 
491858L), Line = c("Central Venous Line", "Central Venous Line", 
"Central Venous Line", "Peripherally Inserted Central Catheter (PICC)", 
"Haemodialysis Catheter", "Peripherally Inserted Central Catheter (PICC)", 
"Haemodialysis Catheter", "Central Venous Line", "Haemodialysis Catheter", 
"Central Venous Line", "Haemodialysis Catheter", "Central Venous Line", 
"Peripherally Inserted Central Catheter (PICC)"), Start = structure(c(1362528000, 
1363219200, 1362268800, 1363219200, 1364774400, 1365120000, 1365465600, 
1364688000, 1364688000, 1365724800, 1365724800, 1366848000, 1369353600
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), End = structure(c(1362787200, 
1363824000, 1363305600, 1363737600, 1365465600, 1366675200, 1365638400, 
1365724800, 1365724800, 1366329600, 1366848000, 1367539200, 1369612800
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Days = c("3.095138889", 
"7.045138889", "11.87777778", "5.736111111", "7.850694444", "18.02083333", 
"1.813888889", "12.32986111", "12.71388889", "6.782638889", "13.14027778", 
"7.718055556", "3.397222222"), dateOrder = c(1L, 2L, 1L, 2L, 
1L, 2L, 3L, 1L, 2L, 3L, 4L, 5L, 6L)), .Names = c("ID", "Line", 
"Start", "End", "Days", "dateOrder"), row.names = 79:91, class = "data.frame")

这就是问题所在。 ID 是否有多个线/导管并不重要。我只需要获取每个 ID 的最早开始日期,每个 ID 的最晚结束日期,并计算每个 ID 连接线/导管的连续天数。

某些情况会混淆问题,例如ID 491858。此人在 2013 年 5 月 3 日删除了一行 (dateOrder = 5),并在 2013 年 5 月 24 日重新插入了 3 天多一点。

我打算如何处理这个问题是从 min(开始日期)和 max(结束日期)之间的连续时间天数中减去间隔(天数)。

数据集中有超过 20,000 条记录。

这是我到目前为止所做的:

将 DF 转换为基于 ID 的 DF 列表。 我打算对每个 DF 应用一个函数,如下所示:

如果每行的后续开始日期和上一个结束日期之间的时间差(天)超过 0,则将 TRUE 或某个任意列值添加到每个数据框。

function(y){
    for (i in length(y)){
        if(difftime(y$Start[i+1], y$End[i], units='days') > 0){

            y$test <- TRUE}
        }
    }

任何帮助将不胜感激。

谢谢。

更新

忽略天数列。这是没有用的。我打算从独特案例中汇总月行数。

【问题讨论】:

    标签: r time


    【解决方案1】:

    我想这样的事情可能会有所帮助,除非我误解了什么:

    unlist(lapply(split(DF, DF$ID), 
      function(x) { totaldays <- max(x$End) - min(x$Start);
       x$Start <- c(x$Start[-1], NA);
       res <- difftime(x$Start[-length(x$Start)], x$End[-length(x$Start)], units = "days");
       res <- res[res > 0];
       res <- ifelse(length(res) == 0, 0, res);
       return(as.numeric(totaldays - res)) }))
    #487622 487639 489027 491858 
    #    10     17     22     36 
    

    DF 是你的dput

    【讨论】:

      【解决方案2】:

      如果我理解正确,您需要导管存在的总天数。为此,我会使用plyr

      #assume df is your dput object
      
      library(plyr)
      day.summary <- ddply(df, "ID", function(x) data.frame(total.days = sum(as.numeric(x$Days))))
      print(day.summary)
            ID total.days
      1 487622   10.14028
      2 487639   17.61389
      3 489027   27.68542
      4 491858   56.08194
      

      【讨论】:

      • 不完全。我确实想计算导管存在的天数。然而,在某些情况下,存在不止一个。无论有多少导管到位,我的计数规则是一天或部分一天在 ID 上存在 1 根导管都计为 1 行天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多