R中的汇总每周数据

时间:2010-12-04 00:55:17

标签: datetime r

我确信这是直截了当的,但我似乎无法让它发挥作用。我有一个代表每日总数的数据框。我只是想按周计算总数,如果没有代表一周则保留零。 R中最好的方法是什么?如果重要,我会从CSV中读取数据并将其转换为R中的日期。

这是我的数据框p1的结构:

'data.frame':   407 obs. of  2 variables:
 $ date:Class 'Date'  num [1:407] 14335 14336 14337 14340 14341 ...
 $ amt : num  45 150 165 165 45 45 150 150 15 165 ...

和前几个......

> head(p1)
        date amt
1 2009-04-01  45
2 2009-04-02 150
3 2009-04-03 165
4 2009-04-06 165
5 2009-04-07  45
6 2009-04-08  45

非常感谢提前。

一个注意事项:我之前看过一个post,但无法让它工作

2 个答案:

答案 0 :(得分:5)

包含lubridate库的解决方案:

library(lubridate)
Lines <- "date,amt
2009-04-01,45
2009-04-02,150
2009-04-03,165
2009-04-13,165
2009-04-14,45
2009-04-15,45
2009-05-15,45"
df <- read.csv(textConnection(Lines))

如果你错过了几周不需要0,那很简单:

weeks <- week(df$date)
sums <- tapply(df$amt, weeks, sum)
# 14  15  16  20 
#360 210  45  45 

将零丢失为零:

span <- min(weeks):max(weeks)
out <- array(0, dim = length(span), dimnames = list(span))
out[dimnames(sums)[[1]]] <- sums
# 14  15  16  17  18  19  20 
#360 210  45   0   0   0  45 

答案 1 :(得分:3)

这是一个读取数据的解决方案,按周汇总,然后在3行代码中填写所有缺失的零周。 read.zoo在假设标题和逗号的字段分隔符时读取它。它将第一列转换为Date类,然后将日期转换为下一个星期五。执行此转换的nextfri函数取自zoo包中的zoo-quickref小插图。 (如果你想让周结束为一周的另一天,只需用另一个日期代码替换5。)read.zoo命令也聚合所有具有相同索引的点(请记住我们已将它们转换为本周的最后一个星期五,因此同一周的所有积分将与他们的指数现在具有相同的星期五)。下一个命令创建一个零宽度的zoo对象,该对象具有从第一个到最后一个的周,并使用fill = 0将其与读取的输出合并,以便填充的周数获得该值。

Lines <- "date,amt
2009-04-01,45
2009-04-02,150
2009-04-03,165
2009-04-13,165
2009-04-14,45
2009-04-15,45"
library(zoo)
nextfri <- function(x) 7 * ceiling(as.numeric(x - 5 + 4)/7) + as.Date(5 - 4)
z <- read.zoo(textConnection(Lines), header = TRUE, sep = ",", 
    FUN = as.Date, FUN2 = nextfri, aggregate = sum)
merge(z, zoo(, seq(min(time(z)), max(time(z)), 7)), fill = 0)

我们使用上面的textConnection(Lines)使其自包含,以便您可以将其复制并粘贴到您的会话中,但实际上textConnection(Lines)将替换为您的文件名称,例如"myfile.csv"

对于上面的输入,输出将是以下zoo对象:

2009-04-03 2009-04-10 2009-04-17 
       360          0        255

您可能希望阅读动物园包中附带的三个小插图。