我有一个这样的数据框:
Date
20130101
20130102
20130103
20130104
我如何在不同的列中拆分Date列? 我已经使用了以下功能,但它无法正常工作:
library(data.table)
setDT(DF)[, tstrsplit(DATE, "/|\\s", type.convert = TRUE)]
答案 0 :(得分:2)
以下是一些不需要任何软件包的解决方案。它们都生成一个data.frame,其中包含"Date"
类列,后跟年,月,日的数字列。 (可重复使用的输入在最后的注释中给出。)
1)POSIXlt 首先将Date
列转换为"Date"
类给出date
,然后转换为未展开的"POSIXlt"
对象,给出{{1} }}。现在适当地选择lt
的元素:
lt
,并提供:
date <- as.Date(as.character(DF$Date), format = "%Y%m%d")
lt <- unclass(as.POSIXlt(date))
with(lt, data.frame(Date = date, year = year + 1900, month = mon + 1, day = mday))
2)格式
Date year month day
1 2013-01-01 2013 1 1
2 2013-01-02 2013 1 2
3 2013-01-03 2013 1 3
4 2013-01-04 2013 1 4
,并提供:
data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
year = as.numeric(format(date, "%Y")),
month = as.numeric(format(date, "%m")),
day = as.numeric(format(date, "%d")))
3)数学
date year month day
1 2013-01-01 2013 1 1
2 2013-01-02 2013 1 2
3 2013-01-03 2013 1 3
4 2013-01-04 2013 1 4
,并提供:
with(DF, data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
year = Date %/% 10000,
month = Date %% 10000 %/% 100,
day = Date %% 100))
4)read.fwf
date year month day
1 2013-01-01 2013 1 1
2 2013-01-02 2013 1 2
3 2013-01-03 2013 1 3
4 2013-01-04 2013 1 4
,并提供:
data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
read.fwf(textConnection(as.character(DF$Date)), c(4, 2, 2),
col.names = c("year", "month", "day")))
5)sub / read.table
date year month day
1 2013-01-01 2013 1 1
2 2013-01-02 2013 1 2
3 2013-01-03 2013 1 3
4 2013-01-04 2013 1 4
,并提供:
date.ch <- sub("(....)(..)(..)", "\\1-\\2-\\3", DF$Date)
data.frame(date = as.Date(date.ch),
read.table(text = date.ch, col.names = c("year", "month", "day"), sep = "-"))
注意:使用的输入 date year month day
1 2013-01-01 2013 1 1
2 2013-01-02 2013 1 2
3 2013-01-03 2013 1 3
4 2013-01-04 2013 1 4
,可重现的形式为:
"DF"
答案 1 :(得分:0)
如果您未开始使用data.table
,则可以使用包含substr
的以下命令:
x = data.frame("20130101", "20130102", "20130103", "20130104")
y<-data.frame(Year=substr(x[,1],1,4),
Month=substr(x[,1],5,6),
Day=substr(x[,1],7,8))
如果您确定您的数据与整个矢量的格式相同。
答案 2 :(得分:0)
您也可以使用lubridate
执行此操作library(dplyr)
library(lubridate)
data =
data_frame(Date = c(20130101, 20130102, 20130103, 20130104) ) %>%
mutate(date =
Date %>%
as.character %>%
ymd,
year = year(date),
month = month(date),
day = day(date))