R Разница во времени между рядами - PullRequest
0 голосов
/ 12 мая 2018

Я триангулировал информацию из других ответов 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 Дополнительно: предупреждающее сообщение: В unclass (time1) - unclass (time2): длинная длина объекта не кратна короткой длине объекта

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы можете использовать 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  
0 голосов
/ 12 мая 2018

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

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

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...