как рассчитать разницу во времени между датами по группам - PullRequest
2 голосов
/ 09 октября 2019

У меня есть датафрейм, содержащий date.times и местоположения. Я хотел бы рассчитать разницу в минутах между записью и предыдущей записью (упорядоченной по дате) внутри групп и преобразовать ее в новый столбец.

Я разработал, как это сделать, используя цикл, ноэто только делает это для всех групп (местоположений) вместе, и я не уверен, как я сделал бы это группой.

# fake data set for example:
df <- data.frame(
  location = c(
    1,1,3,4,4,5,6,5,4,4,3,2,2,1,1,2,3,4,4,2
  ),
  date.time = c(
    "2017-10-22 04:49:23", "2017-10-23 01:02:06",
    "2017-10-23 01:09:17", "2017-10-23 18:32:46",
    "2017-10-24 18:50:19", "2017-11-01 03:07:24",
    "2017-11-01 19:05:58", "2017-11-02 01:56:48",
    "2017-11-02 01:58:16", "2017-11-02 02:00:38",
    "2017-11-06 19:53:56", "2017-11-09 13:08:39",
    "2017-09-18 01:25:27", "2017-09-19 05:19:43",
    "2017-09-21 21:42:33", "2017-09-22 00:49:16",
    "2017-09-22 03:48:05", "2017-09-22 20:56:57",
    "2017-09-23 19:09:48", "2017-09-24 05:52:35"
  ),
  time.diff.mins = NA
) %>% 
  arrange(date.time) %>% 
  mutate(
    date.time = as.POSIXct(
      date.time, 
      format = "%Y-%m-%d %H:%M:%S"
    )
  )

Это дает:

   location           date.time time.diff.mins
1         2 2017-09-18 01:25:27             NA
2         1 2017-09-19 05:19:43             NA
3         1 2017-09-21 21:42:33             NA
4         2 2017-09-22 00:49:16             NA
5         3 2017-09-22 03:48:05             NA
...
...

Таким образом, например, я бы хотел, чтобы разница в минутах между строкой 4 и строкой 1 выводилась в столбце time.diff.mins в строке 4. И столбец time.diff.mins, строка 3, будет иметь разницу во времени между строками 3 и 2, напечатанную в строке 3. Затем итеративно продолжите вычисления различий во времени для предыдущей предыдущей записи в соответствии с группой местоположений.

Этот цикл работает для всего набора данных, но я не знаю, как интегрировать его, например, с dplyr :: group_by или каким-либо другим методом.

for (i in 2:nrow(df)) {
      df[i,3] <- 
        difftime(time1 = as.POSIXct(
          df[i, 2], 
          format = "%Y:%m:%d %H:%M:%S"
        ), 
        time2 = as.POSIXct(
          df[i-1, 2], 
          format = "%Y:%m:%d %H:%M:%S"
        ),
        units = "mins"
        )

    }

Это производит, например:

   location           date.time time.diff.mins
1         2 2017-09-18 01:25:27             NA
2         1 2017-09-19 05:19:43    1674.266667
3         1 2017-09-21 21:42:33    3862.833333
4         2 2017-09-22 00:49:16     186.716667
5         3 2017-09-22 03:48:05     178.816667
...
...

Буду признателен за любые советы или рекомендации!

1 Ответ

0 голосов
/ 09 октября 2019

если нам нужно сгруппировать по 'местоположению'

library(dplyr)
df %>%
    group_by(location) %>%
    mutate(time.diff.mins = difftime(date.time, lag(date.time), unit = 'min'))
...