1

我想计算每个响应与同一个人/姓名下的前一个有效行之间的天数差异。

一组简化数据如下:

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"))
}

但是,我想避免使用嵌套循环。

如何以更有效的方式同时将其应用于每个组/人?

4

1 回答 1

0

这是你要找的吗?

n_vars <- 50
id <- seq(from=1,to=n_vars)
name <- sample(c("n1","n2","n3"),size=n_vars,replace=TRUE)
dte <- sample(seq(as.Date('2018/01/01'), as.Date('2019/01/01'), by="day"), size=n_vars)

data <- data.frame(id,name,dte) %>% 
  group_by(name) %>% 
  arrange(name,dte) %>% 
  mutate(
    diff=dte-lag(dte),
    valid=ifelse(diff<60,"Y","N")
  )
于 2019-05-10T03:36:30.007 回答