ฉันจะกำหนดช่วงเวลาวันที่ / เวลาระหว่างการจัดกลุ่มตัวแปรที่มีความยาวต่างกันโดยใช้ tidyverse ได้อย่างไร

ในชุดข้อมูลของฉัน 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 จะได้รับการชื่นชมอย่างมาก!

ขอบคุณล่วงหน้า.


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