假设我有一个数据框如下:
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识别为数据(或日期)。
非常感谢帮助!
答案 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.table
和lubridate
,您可以尝试:
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")