Как я могу определить интервал даты/времени между группировкой переменных разной длины, используя tidyverse?

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

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


person vengefulsealion    schedule 04.10.2018    source источник
comment
Итак, каковы будут ваши ожидаемые результаты для предоставленных вами выборочных данных?   -  person Maurits Evers    schedule 04.10.2018


Ответы (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")
person www    schedule 04.10.2018