将不同的对象转换成日期格式
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"
在dplyr
的devel
版本中,我们可以结合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))
使用最后注释中的数据我们可以使用 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)
我有一个包含不同格式的开始日期和结束日期的 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"
在dplyr
的devel
版本中,我们可以结合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))
使用最后注释中的数据我们可以使用 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)