我想计算每个响应与同一个人/姓名下的前一个有效行之间的天数差异。
一组简化数据如下:
data <- data.frame(ID = c(1, 2, 3, 4, 5, 6),
Name = c("Jane", rep("May", 3), "Jane", "May"),
`Date Received` = as.POSIXct(c("2018-04-30 00:32", "2018-05-01 18:17",
"2018-06-23 17:12", "2018-07-12 10:17",
"2018-08-02 19:30", "2018-08-17 15:41")))
# ID Name `Date Received`
1 Jane 2018-04-30 00:32
2 May 2018-05-01 18:17
3 May 2018-06-23 17:12
4 May 2018-07-12 10:17
5 Jane 2018-08-02 19:30
6 May 2018-08-17 15:41
这是我想要达到的结果:
# ID Name `Date Received` Difference Valid
1 Jane 2018-04-30 00:32 NA Y
2 May 2018-05-01 18:17 NA Y
3 May 2018-06-23 17:12 53 N
4 May 2018-07-12 10:17 72 Y
5 Jane 2018-08-02 19:30 95 Y
6 May 2018-08-17 15:41 37 N
从发送方收到的第一个响应始终有效。如果在同一发件人发送的上一个有效响应的 60 天内收到响应,则该响应被标识为无效,并随后被忽略。
从 Jane 收到的回复的时间差的计算很简单,因为总共只有 2 个回复。
然而,五月的计算是复杂的。由于响应 #3 的差异为 53 天(2018-05-01 至 2018-06-23),因此将被标记为无效。因此,为了计算响应#4 的时间差,将其与响应#2 而不是响应#3 进行比较,因为响应#2 是先前的有效数据。由于响应 #4 的时间差计算为 72 天(2018 年 5 月 1 日至 2018 年 7 月 12 日),因此也将其标记为有效响应。因此,为了计算响应 #6(2018-07-12 到 2018-08-17)的时间差,将其与响应 #4(即之前的有效数据)进行比较,依此类推。
我看过一些关于计算时间差的类似问题,但它们要么在相邻行之间,要么在组中的第一个观察值中。
这是我目前拥有的代码,它计算与从发件人收到的第一个响应的差异(这是不正确的方法),我不知道如何从这里继续。
data %>%
group_by(Name) %>%
mutate(Difference = difftime(`Date Received`, head(`Date Received`, 1), units = "days"))
有人可以就这个问题的解决方案给我建议吗?
太感谢了!
==================================================== ========================== 编辑于 10/05/2019
我使用 for 循环为每个组/人提出了一个解决方案,以 May 为例:
name <- "May"
dates <- data %>%
filter(Name == name) %>%
pull(Date.Received)
diff <- NA_integer_
valid <- "Y"
for (i in 2:length(dates)) {
day <- dates[i]
valid_dates_pos <- tail(which(valid == "Y"), 1)
recent_valid_day <- dates[valid_dates_pos]
diff_days <- ceiling(as.numeric(difftime(day, recent_valid_day, units = "days")))
diff <- c(diff, diff_days)
valid <- c(valid, ifelse(diff_days <= 60, "N", "Y"))
}
但是,我想避免使用嵌套循环。
如何以更有效的方式同时将其应用于每个组/人?