Как я могу определить интервал даты / времени между группирующими переменными различной длины, используя tidyverse? - PullRequest
0 голосов
/ 04 октября 2018

В моем наборе данных идентификатор может появляться один, два или три или более раз.Я пытаюсь определить временной интервал между каждым из этих разных экземпляров.т. е. каков интервал между первым и вторым появлением идентификатора «AA» И каков интервал между первым и вторым, вторым и третьим появлением идентификатора «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, будут высоко оценены!

Заранее спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

Разница в столбце 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")
...