我确信这是直截了当的,但我似乎无法让它发挥作用。我有一个代表每日总数的数据框。我只是想按周计算总数,如果没有代表一周则保留零。 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,但无法让它工作
答案 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
您可能希望阅读动物园包中附带的三个小插图。