我希望按周聚合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将日期分成几周。
答案 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
答案 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