Создание логической переменной для идентификации строки в группе, которая является минимальной разницей между двумя датами - PullRequest
0 голосов
/ 30 января 2019

Образец воспроизводимых данных 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.

То, что я ищу в самом простомФорма:

  • код для создания переменной, идентифицирующей ближайшее значение к некоторому другому эталонному значению (другой переменной или некоторому предоставленному количеству, включая в данном случае время) в группе наблюдений
  • более разумный способ определить ближайшее время внутри группы

1 Ответ

0 голосов
/ 30 января 2019

Проверьте это решение:

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
  )
...