将不同的对象转换成日期格式

Transform different objects into date formats

我有一个包含不同格式的开始日期和结束日期的 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)

我该怎么做才能忽略时间并将它们变成DATE。我的目标是在日期之间有所作为。我想要以下结果:

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)

我们可以使用 anytime

中的 anydate
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"

dplyrdevel版本中,我们可以结合mutateacross

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))

使用最后注释中的数据我们可以使用 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

备注

我在 KEY 末尾添加了 10,因为只有 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)