【问题标题】:Count days since event in data.table计算 data.table 中事件以来的天数
【发布时间】:2018-06-07 18:02:05
【问题描述】:
library(data.table)
dt <- data.table(cbind(id = c(rep("0151", 16), rep("4615", 16)),
date = rep(c("2011-08-09",
"2011-08-10",
"2011-08-12",
"2011-08-14",
"2011-08-15",
"2011-08-16",
"2011-08-17",
"2011-08-18",
"2011-08-19",
"2011-08-20",
"2011-08-23",
"2011-08-24",
"2011-08-27",
"2011-08-28",
"2011-08-30",
"2011-08-31"), 2),
count = c(c(7, 1, 0, 4, 1, 4, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1),
c(0, 1, 3, 0, 1, 0, 5, 1, 0, 0, 5, 0, 1, 2, 0, 1))))

对于每个 id,我正在寻找一种方法来有效地计算(并存储在新列中)自上次计数 > 0 以来已经过去了多少天。所以第 4 列看起来像这样:

c(NA, 1, 2, 4, 1, 1, 1, 1, 1, 2, 5, 6, 9, 10, 2, 3, NA, NA, 2, 2, 3, 1, 2, 1, 1, 2, 5, 1, 4, 1, 2, 3)

【问题讨论】:

    标签: r date data.table


    【解决方案1】:

    我们可以使用zoo 中的na.locf 创建一个新的日期列,其中日期从最后一天开始,其中count &gt; 0 向下填充并取其中的lag,因为我们不想返回0 天如果给定日期本身具有count &gt; 0。相反,我们想计算从 previous 非零 count 日期开始的天数。最后我们在datedate2之间找到difftime

    library(data.table)
    library(zoo)
    
    dt[,count2 := difftime(date, na.locf(lag(ifelse(count > 0, date, NA)), na.rm = FALSE)), by = id]
    

    结果:

          id       date count  count2
     1: 0151 2011-08-09     7 NA days
     2: 0151 2011-08-10     1  1 days
     3: 0151 2011-08-12     0  2 days
     4: 0151 2011-08-14     4  4 days
     5: 0151 2011-08-15     1  1 days
     6: 0151 2011-08-16     4  1 days
     7: 0151 2011-08-17     2  1 days
     8: 0151 2011-08-18     1  1 days
     9: 0151 2011-08-19     0  1 days
    10: 0151 2011-08-20     0  2 days
    11: 0151 2011-08-23     0  5 days
    12: 0151 2011-08-24     0  6 days
    13: 0151 2011-08-27     0  9 days
    14: 0151 2011-08-28     1 10 days
    15: 0151 2011-08-30     0  2 days
    16: 0151 2011-08-31     1  3 days
    17: 4615 2011-08-09     0 NA days
    18: 4615 2011-08-10     1 NA days
    19: 4615 2011-08-12     3  2 days
    20: 4615 2011-08-14     0  2 days
    21: 4615 2011-08-15     1  3 days
    22: 4615 2011-08-16     0  1 days
    23: 4615 2011-08-17     5  2 days
    24: 4615 2011-08-18     1  1 days
    25: 4615 2011-08-19     0  1 days
    26: 4615 2011-08-20     0  2 days
    27: 4615 2011-08-23     5  5 days
    28: 4615 2011-08-24     0  1 days
    29: 4615 2011-08-27     1  4 days
    30: 4615 2011-08-28     2  1 days
    31: 4615 2011-08-30     0  2 days
    32: 4615 2011-08-31     1  3 days
          id       date count  count2
    

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多