【问题标题】:How can I determining a date/time interval between grouping variables of different lengths using tidyverse?如何使用 tidyverse 确定不同长度的分组变量之间的日期/时间间隔?
【发布时间】:2018-10-04 00:45:34
【问题描述】:

在我的数据集中,ID 可以出现一次、两次或三次或更多次。我正在尝试计算每个不同实例之间的时间间隔。即ID“AA”的第一次和第二次出现之间的间隔是多少以及ID“DD”等的第一次和第二次以及第二次和第三次出现之间的间隔是多少等。

这里有一些示例数据来说明:

library(tidyverse)
library(lubridate)

set.seed(100)
ID <- c("AA", "AA", "AB", "AB", "AC", "AC", "AD", "DD", "DD", "DD", 
   "CA", "CA", "FS", "FS", "FS", "BA", "BA", "TZ", "TZ", "TZ")
rowNum <- c(1:20)
date <- c("2013-05-01", "2014-11-01", "2014-10-01", "2015-09-01", 
  "2014-10-01", "2015-09-01", "2016-01-01", "2017-02-01", "2013-08-01", 
  "2013-05-01", "2011-06-01", "2011-12-01", "2010-09-01", "2012-06-01", 
  "2013-12-01", "2015-01-01", "2015-09-01", "2015-02-01", "2016-04-01", 
  "2017-01-01")

sampleData <- as.data.frame(cbind(ID, rowNum, date)) %>%
  mutate(date = ymd(date)) %>%
  mutate(value_x = runif(length(ID))) %>%
  mutate(value_y = runif(length(ID))) %>%
  mutate(value_z = runif(length(ID))) 

我最初的想法是使用索引来传播数据并使用mutate 来计算差异:

test2 <- sampleData %>%
   group_by(ID) %>%
   mutate(index = row_number(ID)) %>%
   spread(index, date) %>%
   mutate(time_interval1_2 = interval(`1`, `2`))

但是使用这种方法,日期最终会出现在不同的行中,因此我无法计算它们之间的差异。任何关于如何使用tidyverse 解决这个小问题的想法将不胜感激!

提前致谢。

【问题讨论】:

  • 那么对于您提供的示例数据,您的预期输出是什么?

标签: r dplyr tidyverse


【解决方案1】:

区别在于Diff 列。

library(tidyverse)
library(lubridate)

sampleData2 <- sampleData %>%
  arrange(ID, date) %>%
  group_by(ID) %>%
  mutate(Diff = date - lag(date)) %>%
  ungroup()

数据

set.seed(100)
ID <- c("AA", "AA", "AB", "AB", "AC", "AC", "AD", "DD", "DD", "DD", 
        "CA", "CA", "FS", "FS", "FS", "BA", "BA", "TZ", "TZ", "TZ")
rowNum <- c(1:20)
date <- c("2013-05-01", "2014-11-01", "2014-10-01", "2015-09-01", 
          "2014-10-01", "2015-09-01", "2016-01-01", "2017-02-01", "2013-08-01", 
          "2013-05-01", "2011-06-01", "2011-12-01", "2010-09-01", "2012-06-01", 
          "2013-12-01", "2015-01-01", "2015-09-01", "2015-02-01", "2016-04-01", 
          "2017-01-01")

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多