创建逻辑变量以标识组中的行,该行是两个日期时间之间的最小差异

时间:2019-01-30 19:58:59

标签: r dplyr lubridate

可重现的数据样本dput输出:

structure(list(id = c(1, 1, 1, 2, 3, 3, 4), 
start = structure(c(1546326000, 
1546326060, 1546326270, 1546722600, 1546884300, 1546884720,  
1547102430), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
event_time = structure(c(1546326059, 1546326059, 1546326059, 
1546722930, 1546884480, 1546884480, NA), 
tzone = "UTC", class = c("POSIXct", "POSIXt"))), 
.Names = c("id", "start", "event_time"), row.names = c(NA, -7L),
class = "data.frame")

我有一些来自不同来源的混乱数据,并且正在尝试创建一个新的逻辑变量,该逻辑变量可确定组(id)中的哪个观测值与startevent_time变量,并希望在dplyr内执行此操作。

我尝试了几种方法,但是找不到可行的方法。到目前为止,我正在考虑创建一个新变量,该变量计算eventstart之间的时间差,或者如果该差为负,则将其强制为NA,然后创建所需的变量从这个。

代码:

dat %>% mutate(difference = ifelse(event_time > start, 
                                          event_time - start,
                                          NA)) %>%
    mutate(difference = as.integer(difference)) %>%
    group_by(id) %>%
    mutate(is_closest = row_number() == which.min(difference))

这给了我一个错误,它没有创建变量is_closest

我正在寻找的最简单形式是:

  • 代码以创建一个变量,该变量标识一组观测值中与某个其他参考值(另一个变量或提供的数量,在这种情况下为时间)最接近的值
  • 一种更明智的方式来识别组内最近的时间

1 个答案:

答案 0 :(得分:0)

检查此解决方案:

library(lubridate)
library(dplyr)

dat %>%
  mutate(time_diff = start %--% event_time %>% as.numeric()) %>%
  group_by(id) %>%
  mutate(
    min_diff = time_diff[time_diff >= 0] %>% min(),
    min_diff_gr = time_diff == min_diff
  )