我有一个看起来像这样的data.frame:
> df1
Date Name Surname Amount
2015-07-24 John Smith 200
我想将Date中的所有信息外推到新列中,所以我可以达到这个目的:
> df2
Date Year Month Day Day_w Name Surname Amount
2015-07-24 2015 7 24 Friday John Smith 200
所以现在我想要一周,一个月,一天和一周。我怎样才能做到这一点?当我尝试使用as.Date首先使变量成为日期时,data.frame变得混乱并且Date all变为NA(并且没有新列)。谢谢你的帮助!
答案 0 :(得分:3)
这是一个简单而有效的解决方案,使用devel
版本的data.table
及其新的tstrsplit
函数,它只执行一次拆分操作,并且还会更新您的数据集放置
library(data.table)
setDT(df1)[, c("Year", "Month", "Day", "Day_w") :=
c(tstrsplit(Date, "-", type.convert = TRUE), wday(Date))]
df1
# Date Name Surname Amount Year Month Day Day_w
# 1: 2015-07-24 John Smith 200 2015 7 24 6
请注意,我使用了工作日的数字表示,因为wday
包中有一个高效的内置data.table
函数,但如果您确实需要,可以轻松调整它改为使用format(as.Date(Date), format = "%A")
。
要安装devel版本,请使用以下
library(devtools)
install_github("Rdatatable/data.table", build_vignettes = FALSE)
答案 1 :(得分:1)
也许这会有所帮助:
df2 <- df1
dates <- strptime(as.character(df1$Date),format="%Y-%m-%d")
df2$Year <- format(dates, "%Y")
df2$Month <- format(dates, "%m")
df2$Day <- format(dates, "%d")
df2$Day_w <- format(dates, "%a")
之后,您可以根据需要重新排列df2
中列的顺序。