繁体   English   中英

在 R 中聚合每周数据

[英]Aggregate Weekly Data in 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

提前谢谢了。

一个注意事项:我看到了以前一篇文章,但无法让它工作

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 

这是一个读入数据,按周聚合,然后在 3 行代码中用零填充缺失的周的解决方案。 read.zoo在假设标题和逗号的字段分隔符中读取它。 它将第一列转换为Date类,然后将日期转换为下一个星期五。 执行此转换的nextfri函数取自 zoo 包中的zoo-quickref小插图。 (如果你想让周末成为一周中的不同一天,只需将公式中的5 替换为另一个天数。这个想法是,相对于 UNIX Epoch,d-4 落在一周中的某一天 d 在哪里d=0 是星期日,d=1 是蒙达,...,d=6 是星期六,所以任何 7 天的倍数也属于星期几 d。) read.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"

对于上面的输入,输出将是以下动物园对象:

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

您可能想阅读 zoo 软件包附带的三个小插图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM