可重现的数据样本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
)中的哪个观测值与start
和event_time
变量,并希望在dplyr
内执行此操作。
我尝试了几种方法,但是找不到可行的方法。到目前为止,我正在考虑创建一个新变量,该变量计算event
和start
之间的时间差,或者如果该差为负,则将其强制为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
。
我正在寻找的最简单形式是:
答案 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
)