如何按月汇总数据并将其存储在该月的第一天

时间:2015-10-13 18:09:31

标签: r date aggregate

假设我有一个数据框如下:

gageID    date        flow_cms
1011000 1937-02-19   25.768334
1011000 1937-02-20   24.918828
1011000 1937-02-21   24.069322

我想聚合具有相同月份总和流量的行,并且 将结果存储到新的数据值:每个月的第一天;为了获得以下输出:

gageID  date  sum_monthly_flow
1011000 1937-02-01  500.2222
1011000 1937-03-01  589.222

我正在使用这一行:

>rowsum(qfile$flow_cms, format(qfile$date, '%Y-%m-01'))

我获得了正确的金额,但我也希望减少记录日期 独特的一天:每个月的第一天!与上面的条带显示,R不能 将左边的coloumn识别为数据(或日期)。

非常感谢帮助!

3 个答案:

答案 0 :(得分:2)

另一种解决方案:

df
   gageID       date  flow_cms
1 1011000 1937-02-19  25.76833
2 1011000 1937-02-20  24.91883
3 1011000 1937-02-21  24.06932
4 1011000 1937-03-20  12.22200
5 1011000 1937-03-01 589.22200

df1 = aggregate(list(flow_cms=df$flow_cms),by=list(dates=cut(as.POSIXct(df$date),"month")),sum)

df1
       dates  flow_cms
1 1937-02-01  74.75648
2 1937-03-01 601.44400

答案 1 :(得分:0)

首先确保你的日期"列在R:

中正确格式化为日期对象
qfile$date <- as.Date(qfile$date, format = "%Y-%m-%d")

然后我们可以使用format来提取月份和年份,然后使用group_by来计算总和并获取第一个日期:

library(dplyr)
qfile %>% mutate(monthyear = as.character(format(date, "%m-%Y"))) %>%
          arrange(date) %>% 
          group_by(monthyear) %>%
          summarise(date=date[1], flow = sum(flow_cms))

这将为您提供数据中每个月的首次记录。

答案 2 :(得分:0)

使用data.tablelubridate,您可以尝试:

library(data.table)
setDT(qfile)[, lapply(.SD, sum), by = .(gageID, date = lubridate::floor_date(date, "month"))]
    gageID       date  flow_cms
1: 1011000 1937-02-01  74.75648
2: 1011000 1937-03-01 601.44400

请注意,假设date已经属于Date类,而gageID是另一个分组参数。

或者,使用data.table自己的mday()函数可以避免从另一个包调用函数(感谢@Henrik):

setDT(qfile)[, lapply(.SD, sum), by = .(gageID, date = date - mday(date) + 1)] 

数据

此处使用Abdou's sample data

qfile <- structure(list(gageID = c(1011000L, 1011000L, 1011000L, 1011000L, 
1011000L), date = structure(c(-12004, -12003, -12002, -11975, 
-11994), class = "Date"), flow_cms = c(25.76833, 24.91883, 24.06932, 
12.222, 589.222)), .Names = c("gageID", "date", "flow_cms"), row.names = c(NA, 
-5L), class = "data.frame")