R Разница во времени между рядами

Я триангулировал информацию из других ответов SO для приведенного ниже кода, но застрял с сообщением об ошибке. Искал в SO схожие ошибки и решения, но не смог их понять, поэтому помощь приветствуется.

Для каждой группы («id») я хочу получить разницу между временем начала для последовательных строк.

Воспроизводимые данные:

require(dplyr)
df <-data.frame(id=as.numeric(c("1","1","1","2","2","2")), 
            start= c("1/31/17 10:00","1/31/17 10:02","1/31/17 10:45", 
                             "2/10/17 12:00", "2/10/17 12:20","2/11/17 09:40"))
time <- strptime(df$start, format = "%m/%d/%y %H:%M")
df %>%
group_by(id)%>%
mutate(diff = time - lag(time),
     diff_mins = as.numeric(diff, units = 'mins'))

Выдает мне ошибку:

Ошибка в mutate_impl (.data, точки): столбец diff должен иметь длину 3 (размер группы) или один, а не 6 Дополнительно: Предупреждение: In unclass (time1) - unclass (time2): более длинная длина объекта не кратна меньшей длины объекта


person Bananas    schedule 12.05.2018    source источник


Ответы (2)


Вы можете использовать lag и difftime (согласно Хэдли):

df %>%
  mutate(time = as.POSIXct(start, format = "%m/%d/%y %H:%M")) %>%
  group_by(id) %>%
  mutate(diff = difftime(time, lag(time)))

# A tibble: 6 x 4
# Groups:   id [2]
     id start         time                diff  
  <dbl> <fct>         <dttm>              <time>
1    1. 1/31/17 10:00 2017-01-31 10:00:00 <NA>  
2    1. 1/31/17 10:02 2017-01-31 10:02:00 2     
3    1. 1/31/17 10:45 2017-01-31 10:45:00 43    
4    2. 2/10/17 12:00 2017-02-10 12:00:00 <NA>  
5    2. 2/10/17 12:20 2017-02-10 12:20:00 20    
6    2. 2/11/17 09:40 2017-02-11 09:40:00 1280  
person andrew_reece    schedule 12.05.2018
comment
Спасибо большое. Это отлично работает для меня, поскольку он обрабатывает первую группу в каждой группе как АН. - person Bananas; 12.05.2018
comment
Пожалуйста! Отметьте этот ответ как принятый, если вы считаете, что это лучшее решение вашего вопроса, нажав на галочку слева от ответа. - person andrew_reece; 13.05.2018

Вы имеете в виду что-то подобное?

Здесь нет необходимости в lag, достаточно простого diff на сгруппированных time.

df %>%
    mutate(start = as.POSIXct(start, format = "%m/%d/%y %H:%M")) %>%
    group_by(id) %>%
    mutate(diff = c(0, diff(start)))
## A tibble: 6 x 3
## Groups:   id [2]
#     id start                diff
#  <dbl> <dttm>              <dbl>
#1    1. 2017-01-31 10:00:00    0.
#2    1. 2017-01-31 10:02:00    2.
#3    1. 2017-01-31 10:45:00   43.
#4    2. 2017-02-10 12:00:00    0.
#5    2. 2017-02-10 12:20:00   20.
#6    2. 2017-02-11 09:40:00 1280.
person Maurits Evers    schedule 12.05.2018
comment
Это прекрасно сработало, @Maurits. Спасибо большое за вашу помощь. - person Bananas; 12.05.2018
comment
Единственная проблема - 0, поскольку первая запись каждой группы вызовет проблемы с анализом в будущем. Любой способ сделать эти NA (я думаю, что df [which [df == 0) ‹-NA вызовет проблемы с различиями, которые на самом деле равны 0, в отличие от того, чтобы быть первым в группе)? Спасибо большое за вашу помощь. - person Bananas; 12.05.2018
comment
@Bananas Я бы сказал, что нет необходимости в lagdifftime); использование простого diff должно быть быстрее. Просто замените c(0, diff(start)) на c(NA, diff(start)). - person Maurits Evers; 13.05.2018