1

我想按周在 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)

我使用了 lubridate 包来执行以下操作;

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 但这似乎我付出了太多努力。

如何将 lubridates 转换为正常的 R 日期以便我可以执行聚合?正常的 R 日期在aggregate函数中工作得非常好,所以我想我宁愿只使用 lubridate 将日期合并为几周。

4

2 回答 2

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

在此处输入图像描述

于 2014-07-10T11:41:55.877 回答
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
于 2014-07-10T10:05:53.497 回答