Преобразуйте различные объекты в форматы даты - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть DF, который содержит даты начала и окончания в разных форматах. И эти даты похожи на характер.

KEY <- c (12,55,889)
START <- c ("2019-01-03T16: 59: 51", "2018-12-31T12: 03: 13", "2019-01-07", "2019-01-08")
END <- c ("2019-01-10T13: 10: 00", "2019-01-05T12: 00: 00", "2019-01-09", "2019-01-12")
DF <- data.frame (KEY, START, END)

Как бы я поступил, чтобы не обращать внимания на время и превратить их в ДАТУ. Моя цель - сделать разницу между датами. Я хочу следующий результат:

KEY <- c (12,55,889,896)
START <- c ("2019-01-03", "2018-12-31", "2019-01-07", "2019-01-08")
END <- c ("2019-01-10", "2019-01-05", "2019-01-09", "2019-01-12")
DIF <- c (7,5,2,4)
DF <- data.frame (KEY, START, END, DIF)

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Используя данные в примечании в конце, мы можем использовать as.Date, поскольку он игнорирует любой мусор в конце. Пакеты не используются.

transform(DF, START = as.Date(START), END = as.Date(END))
##   KEY      START        END
## 1  12 2019-01-03 2019-01-10
## 2  55 2018-12-31 2019-01-05
## 3 889 2019-01-07 2019-01-09
## 4  10 2019-01-08 2019-01-12

Примечание

Я добавил 10 в конце KEY, так как было только 3 элемента против 4 для остальных столбцов.

KEY <- c(12,55,889,10)
START <- c("2019-01-03T16: 59: 51", "2018-12-31T12: 03: 13", "2019-01-07", "2019-01-08")
END <- c("2019-01-10T13: 10: 00", "2019-01-05T12: 00: 00", "2019-01-09", "2019-01-12")
DF <- data.frame(KEY, START, END)
1 голос
/ 20 февраля 2020

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

library(dplyr)
library(anytime)
DF1 <- DF %>%
          mutate_at(vars(START, END), anydate)
DF1
#  KEY      START        END
#1  12 2019-01-03 2019-01-10
#2  55 2018-12-31 2019-01-05
#3 889 2019-01-07 2019-01-09
#4 896 2019-01-08 2019-01-12

str(DF1)
#'data.frame':  4 obs. of  3 variables:
# $ KEY  : num  12 55 889 896
# $ START: Date, format: "2019-01-03" "2018-12-31" "2019-01-07" "2019-01-08"
# $ END  : Date, format: "2019-01-10" "2019-01-05" "2019-01-09" "2019-01-12"

В devel версии dplyr мы можем объединить mutate с across

DF %>% 
    mutate(across(c(START, END), anydate))
#  KEY      START        END
#1  12 2019-01-03 2019-01-10
#2  55 2018-12-31 2019-01-05
#3 889 2019-01-07 2019-01-09
#4 896 2019-01-08 2019-01-12

данные

DF <- structure(list(KEY = c(12, 55, 889, 896), START = structure(c(2L, 
1L, 3L, 4L), .Label = c("2018-12-31T12: 03: 13", "2019-01-03T16: 59: 51", 
"2019-01-07", "2019-01-08"), class = "factor"), END = structure(c(3L, 
1L, 2L, 4L), .Label = c("2019-01-05T12: 00: 00", "2019-01-09", 
"2019-01-10T13: 10: 00", "2019-01-12"), class = "factor")),
class = "data.frame", row.names = c(NA, 
-4L))
...