与Rubridate汇总回到R中的正常日期

时间:2014-07-10 09:53:32

标签: r ggplot2 lubridate

我希望按周聚合R中的数据框,我正在尝试使用lubridate来完成它。

date = as.Date(c('2006-05-02','2007-05-03','2006-05-04','2006-05-05','2006-05-08','2006-05-09'))
total = c(1,2,3,4,5,10)
df=data.frame(date, total)

我使用了rubridate包来做以下事情;

df$wk = weeks(agg$date)
agg = aggregate(data=agg, total ~ date + variable , FUN=sum)

这似乎没有返回任何有效的东西。您可以将周数转换为字符串,但之后您需要将周数转换回正常的R日期。

df$wk = as.character(weeks(agg$date))
agg = aggregate(data=agg, total ~ date , FUN=sum)

这带来了另一个问题,日期现在是看起来像这样的字符串;

"113029d 0H 0M 0S"

我想在ggplot数据框上使用agg,因此我需要将此字符串转换为ggplot可以理解的内容。 as.Date()显然不起作用,似乎我可以将日期转换为unix_timestamp但似乎我做了太多的努力。

如何将rubridates转换为正常的R日期,以便我可以执行聚合?正常的R日期在aggregate函数中完全正常,所以我认为我宁愿只使用rubridate将日期分成几周。

2 个答案:

答案 0 :(得分:3)

我不完全确定你想要的输出,但这应该有效(仅使用基数R)

df$Weeks <- paste(format(df$date, "%U"), format(df$date, "%Y")) # Setting a week/year combination
temp <- aggregate(total ~ Weeks, df, sum)
temp <- temp[order(substr(temp$Weeks, 4, 8), substr(temp$Weeks, 1, 2)), ] # Ordering by year by week

library(ggplot2)
ggplot(temp, aes(Weeks, total, group = 1)) + 
geom_line() +
scale_x_discrete(limits = temp$Weeks) # rescaling x axis so it will follow the correct Year/Week order

enter image description here

答案 1 :(得分:0)

Prolly你可以使用data.table

require(data.table)
dt <- data.table(df)
dt[,sum(total),by=list(year(date),week(date))]
    year week V1
 1: 2006   18 10
 2: 2006   19 15