2015-01-22 2 views
2

В настоящее время я борюсь с проблемой новичка относительно расчета разницы во времени между двумя событиями.Рассчитать разницу во времени между двумя событиями (заданная дата и время) в R

Я хочу взять столбец, состоящий из даты и времени (оба значения в одном столбце), и рассчитать разницу во времени со значением предыдущей/следующей строки с одинаковым ID (A или B в этом пример).

ID = c("A", "A", "B", "B") 
time = c("08.09.2014 10:34","12.09.2014 09:33","13.08.2014 15:52","11.09.2014 02:30") 
d = data.frame(ID,time) 

Мой желаемый результат в формате часы: минуты

time difference = c("94:59","94:59","682:38","682:38") 

Формат Days:Hours:Minutes или что-то подобное будет работать, до тех пор, как он может быть легко реализовано. Я гибко отношусь к формату вывода, выше всего лишь идея, которая перешла мне на ум.

Для каждого отдельного идентификатора у меня всегда есть две строки (в примере 2xA и 2xB). У меня нет убедительной идеи, как избежать повторения разницы.

Я уже пробовал несколько примеров, которые я нашел в stackoverflow. Большинство из них использовали POSIXt и strptime. Однако мне не удалось применить эти идеи к моему набору данных.

+0

'd $ time <- strptime (d $ time,% d.% M.% Y% H:% M"), чтобы сделать этот столбец классом POSIXlt' – hrbrmstr

ответ

1

Вот моя попытка с помощью dplyr

library(dplyr) 
d %>% 
    mutate(time = as.POSIXct(time, format = "%d.%m.%Y %H:%M")) %>% 
    group_by(ID) %>% 
    mutate(diff = paste0(gsub("[.].*", "", diff(time)*24), ":", 
         round(as.numeric(gsub(".*[.]", ".", diff(time)*24))*60))) 


# Source: local data frame [4 x 3] 
# Groups: ID 
# 
# ID    time diff 
# 1 A 2014-09-08 10:34:00 94:59 
# 2 A 2014-09-12 09:33:00 94:59 
# 3 B 2014-08-13 15:52:00 682:38 
# 4 B 2014-09-11 02:30:00 682:38 
1

очень (для меня) хак-иш базового раствора:

ID <- c("A", "A", "B", "B") 
time <- c("08.09.2014 10:34", "12.09.2014 09:33", "13.08.2014 15:52","11.09.2014 02:30") 
d <- data.frame(ID, time) 

d$time <- as.POSIXct(d$time, format="%d.%m.%Y %H:%M") 

unlist(unname(lapply(split(d, d$ID), function(d) { 
    sapply(abs(diff(c(d$time[2], d$time))), function(x) { 
    sprintf("%s:%s", round(((x*24)%/%1)), round(((x*24)%%1 *60))) 
    }) 
}))) 

## [1] "94:59" "94:59" "682:38" "682:38" 

Я должен верить эта функция существует где-то уже, Тхо.

0

похожи на попытки Давида и hrmbrmstr, я обнаружил, что это решение с помощью difftime работает

Я использую rowshift сценарий, я нашел на StackOverflow

rowShift <- function(x, shiftLen = 1L) { 
    r <- (1L + shiftLen):(length(x) + shiftLen) 
    r[r<1] <- NA 
    return(x[r]) 
} 
d$time.c <- as.POSIXct(d$time, format = "%d.%m.%Y %H:%M") 
d$time.prev <- rowShift(d$time.c,-1) 
d$diff <- difftime(d$time.c,d$time.prev, units="hours") 

Каждый второй ряд d$diff имеет положительное/отрицательное значения в результатах. Я удаляю все строки с отрицательными значениями и имею разницу между первым и последним временем для каждого идентификатора.

+1

'diffftime' - это то же самое' diff' меня и hrbrmstr. 'diff' - это общая функция, которая, если получает объект класса' POSIXct', использует 'diffftime'. –

Смежные вопросы