2014-09-11 4 views
2

Я пытаюсь вычислить разницу во времени между двумя временными метками в двух соседних строках с помощью пакета dplyr. Вот код:difftime между строками с использованием dplyr

tidy_ex <- function() { 

    library(dplyr) 

    #construct example data 
    data <- data.frame(code = c(10888, 10888, 10888, 10888, 10888, 10888, 
            10889, 10889, 10889, 10889, 10889, 10889, 
            10890, 10890, 10890), 
          station = c("F1", "F3", "F4", "F5", "L5", "L7", "F1", 
             "F3", "F4", "L5", "L6", "L7", "F1", "F3", "F5"), 
          timestamp = c(1365895151, 1365969188, 1366105495, 
              1367433149, 1368005216, 1368011698, 
              1366244224, 1366414926, 1367513240, 
              1367790556, 1367946420, 1367923973, 
              1365896546, 1365907968, 1366144207)) 

    # reformat timestamp as POSIXct 
    data$timestamp <- as.POSIXct(data$timestamp,origin = "1970-01-01") 

    #create tbl_df 
    data2 <- tbl_df(data) 

    #group by code and calculate time differences between two rows in timestamp column 
    data2 <- data2 %>% 
      group_by(code) %>% 
      mutate(diff = c(difftime(tail(timestamp, -1), head(timestamp, -1)))) 

    data2 

    } 

Код выдает сообщение об ошибке:

Error: incompatible size (5), expecting 6 (the group size) or 1 

Я предполагаю, что это потому, что разница в последнюю строку производит Ч (так как нет никакого дальнейшего смежного ряда). Однако метод difftime/head-tails работает с пакетом plyr вместо dplyr (see this StackOverflow post)

Как я могу заставить его работать с помощью dplyr?

+2

Вы можете использовать 'лаг () 'вместо diff, вероятно. Если вы используете 'lag()', число строк равно N, а не N-1. – jazzurro

+0

'diff' будет иметь длину N-1 try' mutate (diff = c (0, difftime (tail (timestamp, -1), head (timestamp, -1)))) ' – Victorp

ответ

4

Благодаря Victorp за предложение. Я изменил мутировать строку:

mutate(diff = c(difftime(tail(timestamp, -1), head(timestamp, -1)),0)) 

(0 я поместил в конце поэтому расчет разница будет начать в первом ряду).

+9

' difftime (timestamp, lag (timestamp)) 'будет немного проще – hadley

0

В качестве альтернативы, вы можете просто попробовать:

... %>% 
mutate(diff = c(0,diff(timestamp))) 

Или, если вы хотите явно назначить устройство и преобразовать столбец числовой для других расчетов:

... %>% 
mutate(diff = c(0,as.numeric(diff(timestamp), units="mins"))) 
Смежные вопросы