【问题标题】:calculating followup per id计算每个 id 的跟进
【发布时间】:2018-04-05 21:47:38
【问题描述】:

我正在尝试重新计算中等大小数据框(16000 行 100 个变量)的后续时间(以年为单位)。

此处已部分询问 Calculating time difference by ID 但这里描述的本质上是我想要做的,但我没有可用的时间唯一日期。

我想弄清楚为什么它只适用于日期。

当我运行这段代码时,它可以工作:

生成数据:

Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",4))
date = c("2014-09-25 08:39:45", "2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-10-10 23:04:00", "2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24", "2014-10-10 23:04:00")
df = data.frame(Incident.ID..,date, stringsAsFactors = FALSE)

运行代码

library(dplyr)
library(lubridate)
df %>%
  group_by(Incident.ID..) %>%
  mutate(diff = c(0, diff(ymd_hms(date))))

输出

  Incident.ID..   date                    diff
  <chr>           <chr>                  <dbl>
1 INCFI0000029582 2014-09-25 08:39:45       0.
2 INCFI0000029582 2014-09-25 08:39:48       3.
3 INCFI0000029582 2014-09-25 08:40:44      56.
4 INCFI0000029582 2014-10-10 23:04:00 1347796.
5 INCFI0000029587 2014-09-25 08:33:32       0.
6 INCFI0000029587 2014-09-25 08:34:41      69.
7 INCFI0000029587 2014-09-25 08:35:24      43.
8 INCFI0000029587 2014-10-10 23:04:00 1348116.

我的数据是 YMD 格式,所以这看起来合乎逻辑:

生成数据

Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",4))
date = c("2014-09-20", "2014-09-21", "2014-09-22", "2014-09-23", "2014-09-26", "2014-09-27", "2014-09-28", "2014-10-10")
df = data.frame(Incident.ID..,date, stringsAsFactors = FALSE)

运行代码

library(dplyr)
library(lubridate)
df %>%
  group_by(Incident.ID..) %>%
  mutate(diff = c(0, diff(ymd(date))))

输出

  Incident.ID..   date        diff
  <chr>           <chr>      <dbl>
1 INCFI0000029582 2014-09-20    0.
2 INCFI0000029582 2014-09-21    1.
3 INCFI0000029582 2014-09-22    1.
4 INCFI0000029582 2014-09-23    1.
5 INCFI0000029587 2014-09-26    0.
6 INCFI0000029587 2014-09-27    1.
7 INCFI0000029587 2014-09-28    1.
8 INCFI0000029587 2014-10-10   12.

它现在给出后续观察之间的差异,而不是第一个 Incident.ID..

这里给出了答案:Date difference per ID with dplyr without hours, minutes or seconds 但我仍然不明白为什么使用上面这个非常相似的代码它不起作用。 (任何为什么它现在以天而不是秒来表示差异)。

当使用数据表方法时,我得到相同的结果:

padded.diff = function(x) c(0L, diff(x)) 
library(data.table) 
setDT(df)[, date.diff := padded.diff(as.POSIXct(date)), by = Incident.ID..]
View(df)

非常欢迎对此行为的任何解释,因为它不会给出解析错误。 (这可能与posix时间有关,但我很困惑)

【问题讨论】:

  • 你的第一个例子不是用ymd_hms,也给出了后续观察的区别吗?第 3 行是第 2 行 + 56 秒,而不是第 1 行加 56 秒。 diff 的默认 lag 为 1。
  • @neilfws 你说得非常对。我没有充分检查,我认为接受的答案是正确的。也就是说,有没有更优雅的方法来做到这一点?

标签: r dplyr data.table lubridate


【解决方案1】:

我想这是对 diff 函数的不同方法的调用,具体取决于您传递给它的类。

c("2014-09-20") %>% ymd() %>% class()
#    [1] "Date"

c("2014-09-25 08:39:45") %>% ymd_hms() %>% class()
#    [1] "POSIXct" "POSIXt" 

因此,将Date 类的对象传递给diff 将为您提供天数(通过调用diff.Date),而传递POSIXt 类的对象将为您提供秒数(diff.POSIXt) .

【讨论】:

    【解决方案2】:

    我不确定,但它不会说它与课程有关。 我的建议是这样的。

    Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",5)) 
    #changing second rep from 4 to 5
    date = c("2014-09-20", "2014-09-21", "2014-09-22", "2014-09-23", "2014-09-26", "2014-09-27", "2014-09-28", "2014-10-10", "2014-10-10 00:00:01") 
    #adding one more timeframe right after the last one
    df = data.frame(Incident.ID..,date, stringsAsFactors = FALSE)
    
    padded.diff = function(x) c(0L, diff(x)) 
    df2=within(df, {
    date.diff   = ave(as.numeric(as.POSIXct(date)), Incident.ID.., FUN = padded.diff) })
    df2 = df2[-nrow(df2),]
    
    df2
    Incident.ID..       date date.diff
    1 INCFI0000029582 2014-09-20         0
    2 INCFI0000029582 2014-09-21     86400
    3 INCFI0000029582 2014-09-22     86400
    4 INCFI0000029582 2014-09-23     86400
    5 INCFI0000029587 2014-09-26         0
    6 INCFI0000029587 2014-09-27     86400
    7 INCFI0000029587 2014-09-28     86400
    8 INCFI0000029587 2014-10-10   1036800
    

    我的猜测是它显示天而不是秒是某种形式的截断。所以我增加了一个元素,改变了 1 秒,以便在几秒钟内强制显示。

    或者只是使用包含 86400 秒的 1 天的知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多