Преобразование фактора в POSIXlt с датой распространения в R

У меня есть вектор с информацией о времени и датой, отмеченной только один раз в день. Мне нужно преобразовать вектор в пригодный для использования формат, такой как POSIXlt. Время упорядочено, где все времена (%H:%M) в течение дня относятся к последней дате, отмеченной перед временем без даты.

t <- structure(c(6L, 1L, 2L, 3L, 4L, 5L, 10L, 7L, 8L, 9L), 
    .Label = c("00:15", "00:25", "00:35", "00:45", "02:05", "20.01.2013; 0:05", 
    "20:48", "20:58", "21:08", "25.01.2013; 20:38"), class = "factor")

Из нескольких предыдущих ответов на вопросы о преобразовании фактора в дату (например, здесь) я знаю, как преобразовать t[c(1, 7)].

t1 <- strptime(as.character(t[c(1, 7)]), format = "%d.%m.%Y; %H:%M")
# t1
# [1] "2013-01-20 00:05:00 CET" "2013-01-25 20:38:00 CET"

Однако как я могу распространить отсутствующую дату на оставшиеся значения, чтобы они правильно конвертировались?


person nya    schedule 02.12.2016    source источник
comment
эти даты отличаются на один день?   -  person akrun    schedule 02.12.2016
comment
@akrun В основном да, но не всегда.   -  person nya    schedule 02.12.2016
comment
У вас действительно есть две проблемы: изменение формы ваших данных и анализ даты и времени.   -  person Dirk Eddelbuettel    schedule 02.12.2016
comment
@DirkEddelbuettel Верно. Вы можете помочь?   -  person nya    schedule 02.12.2016


Ответы (2)


Мы можем использовать dplyr

library(dplyr)
data.frame(t) %>%
     mutate(Date = as.Date(t, "%d.%m.%Y")) %>% 
     group_by(grp = cumsum(!is.na(Date))) %>%
     mutate(Date = Date[1L],
            DateTime = as.POSIXct(paste(Date, sub(".*;", "", t)))) %>% 
     ungroup() %>%
     select(DateTime)  
#           DateTime
#                <dttm>
#1  2013-01-20 00:05:00
#2  2013-01-20 00:15:00
#3  2013-01-20 00:25:00
#4  2013-01-20 00:35:00
#5  2013-01-20 00:45:00
#6  2013-01-20 02:05:00
#7  2013-01-25 20:38:00
#8  2013-01-25 20:48:00
#9  2013-01-25 20:58:00
#10 2013-01-25 21:08:00

Или с помощью base R

i1 <- nchar(as.character(t))==5
v1 <- ifelse(i1, paste(sub(";.*", ";", t[!i1])[cumsum(!i1)], 
                     sub(".*;\\s+", "", t[i1])), as.character(t))

strptime(v1, "%d.%m.%Y %H:%M")
person akrun    schedule 02.12.2016
comment
К сожалению, ваш код добавил дату в каждую строку. У меня есть переменное количество строк, принадлежащих одной дате. - person nya; 02.12.2016
comment
@nya Можете ли вы опубликовать лучший пример, отражающий проблему. - person akrun; 02.12.2016
comment
Оба ответа работают для меня, но я принимаю eipi10, потому что мне легче понять. Спасибо за вашу альтернативу. - person nya; 02.12.2016

person    schedule
comment
Хороший. Я бы использовал <- вместо =, но это только я. - person Dirk Eddelbuettel; 02.12.2016
comment
Спасибо @DirkEddelbuettel. Я думаю, что я просто слишком ленив, чтобы делать все это лишнее печатать :). - person eipi10; 02.12.2016