我正在努力寻找有关将日期更改为三列的信息。
当前数据:
Date
2018-06-07
2017-03-01
2015-11-30
期望的结果
Year Month Day
2018 06 07
2017 03 01
2015 11 30
答案 0 :(得分:3)
1)chron 由于没有重复指定输入,我们假设:
Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")
在这种情况下这可行 - 如果列顺序无关紧要,您可以省略[...]
部分:
library(chron)
do.call("cbind", month.day.year(Dates)[c("year", "month", "day")])
提供此矩阵(如果您需要数据框,请使用data.frame
代替cbind
):
year month day
[1,] 2018 6 7
[2,] 2017 3 1
[3,] 2015 11 30
如果日期属于"Date"
类,则上述代码也可以使用。
2)格式(基础)
DatestoNum <- function(fmt) as.numeric(format(as.Date(Dates), fmt))
sapply(c(year = "%Y", month = "%m", day = "%d"), DatestoNum)
给出相同的结果。如果Dates
属于"Date"
级,这也可以使用。在这种情况下,您可以选择删除as.Date
。如果您更喜欢数据框结果,请在结果上使用as.data.frame
。
2a)或者将其写出来:
cbind(year = DatestoNum("%Y"), month = DatestoNum("%m"), day = DatestoNum("%d"))
3)lubridate
library(lubridate)
cbind(year = year(Dates), month = month(Dates), day = day(Dates))
4)read.table(base)
read.table(text = format(Dates), sep = "-", col.names = c("year", "month", "day"))
如果Dates
已经是字符,您可以选择省略format
。
答案 1 :(得分:0)
Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")
> scan(text=Dates, what=list(Year="",Month="",Day=""), sep="-")
Read 3 records
$Year
[1] "2018" "2017" "2015"
$Month
[1] "06" "03" "11"
$Day
[1] "07" "01" "30"
这样就可以在&#34;数据框&#34;布置:
data.frame( scan(text=Dates, what=list(Year="",Month="",Day=""),
sep="-", quiet=TRUE) )
#-------
Year Month Day
1 2018 06 07
2 2017 03 01
3 2015 11 30
如果这些值已经是数据框或列表中的日期(或因子)分类变量,那么您需要as.character
强制Date
列才能成功。
答案 2 :(得分:0)
用户似乎只是将日期保留为需要在分隔符上拆分的字符串。在这种情况下,使用tidyr::separate
是最简单的解决方案:
library(tidyverse)
Dates <- data.frame(id = c('a', 'b', 'c'),
date = c("2018-06-07", "2017-03-01", "2015-11-30"))
Dates %>%
separate(date, c("Year","Month","Day"))
id Year Month Day
1 a 2018 06 07
2 b 2017 03 01
3 c 2015 11 30
更安全的解决方案可能是将日期存储为某种日期对象。在这种情况下,您可能希望使用@ G.Grothendieck发布的解决方案。