2010-12-04 114 views
2

我确定这很简单,但我似乎无法使其发挥作用。我有一个数据框表示每日总计。我只想按周总计总数,如果一周没有代表,则保留一个零。 R中最好的方法是什么?如果它的事项,我从CSV读取数据,并在R.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但不能让它的工作

+0

尝试将您的数据转换为“动物园”或“xts”。另外,请发布您正在尝试的命令以及它给出的错误输出。我认为如果你按照Shane的指导,并且在`“sum”后面设置`na.rm = T`,那么它应该将`NaN`抛回都是`NA`的星期。 – 2010-12-04 01:12:10

回答

2

这里是一个解决方案,在数据读取,按周汇总,然后在缺少周零所有填写3线的代码。 read.zoo在假定标题和逗号分隔字段时读取它。它将第一列转换为Date类,然后将日期转换为下一个星期五。执行此转换的nextfri函数取自动物园包中的zoo-quickref小插曲。 (如果你想让星期的结束是一周中的不同日子,只需要用另一天的数字替换5)。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 

有三个护身符随之而来,你可能需要阅读动物园包。

+0

这正是我正在寻找的!两件事:我得到一个错误,因为我怀疑这是我的CSV文件中的“日期”是日/月/年。我在帮助中看到,我可以将其作为格式“%d /%m /%Y”传递,但我不确定是否会导致错误。其次,我希望这个星期在周日结束,周一开始新的一周。再次感谢! – Btibert3 2010-12-04 14:30:53

4

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