首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何汇总用水年份(2008年10月1日-2009年9月31日)

如何汇总用水年份(2008年10月1日-2009年9月31日)
EN

Stack Overflow用户
提问于 2019-07-14 08:10:36
回答 2查看 277关注 0票数 0

我有使用R每天测量降水量的数据。我的日期格式为2008-01-01,范围为10年。我正在尝试从2008-10-01到2009-09-31进行汇总,但我不确定如何进行汇总。聚合中有没有设置聚合和分组的开始日期的方法?

我当前的代码是

代码语言:javascript
运行
复制
data<- aggregate(data$total_snow_cm, by=list(data$year), FUN = 'sum')

但是这个输出给出了从1月到12月每年降雪量的总和,但我希望它包括08年10月到09年9月。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-14 08:44:20

假设你的数据是长格式的,我会这样做:

代码语言:javascript
运行
复制
 library(tidyverse)

 #make sure R knows your dates are dates - you mention they're 'yyyy-mm-dd', so
 yourdataframe <- yourdataframe %>% 
                  mutate(yourcolumnforprecipdate = ymd(yourcolumnforprecipdate) 


 #in this script or another, define a water year function
 water_year <- function(date) {
               ifelse(month(date) < 10, year(date), year(date)+1)}

 #new wateryear column for your data, using your new function
 yourdataframe <- yourdataframe %>% 
                  mutate(wateryear = water_year(yourcolumnforprecipdate)

 #now group by water year (and location if there's more than one) 
 #and sum and create new data.frame

 wy_sums <- yourdataframe %>% group_by(locationcolumn, wateryear) %>% 
            summarize(wy_totalprecip = sum(dailyprecip))

有关更多信息,请阅读tidyverse的伟大子库lubridate - ymd()函数就来自于此。还有其他类似ymd_hms()的库。mutate()来自tidyverse的dplyr库。这两个库都非常有用!

票数 0
EN

Stack Overflow用户

发布于 2019-07-14 15:21:19

我想给出这个问题的实际答案,即aggregate()方法被问到的地方。

您可以使用with()将数据规范包装在aggregate()周围。在with()中,您可以像定义数字一样定义日期间隔。

代码语言:javascript
运行
复制
df1.agg <- with(df1[as.Date("2008-10-01") <= df1$year & df1$year <= as.Date("2009-09-30"), ], 
                aggregate(total_snow_cm, by=list(year), FUN=sum))

另一种方法是使用aggregate()的公式接口,其中data和间隔也可以在aggregate()调用中指定。

代码语言:javascript
运行
复制
df1.agg <- aggregate(total_snow_cm ~ year, 
                     data=df1[as.Date("2008-10-01") <= df1$year & 
                                df1$year <= as.Date("2009-09-30"), ], FUN=sum)

结果

代码语言:javascript
运行
复制
head(df1.agg)
#         year total_snow_cm
# 1 2008-10-01           171
# 2 2008-10-02           226
# 3 2008-10-03           182
# 4 2008-10-04           129
# 5 2008-10-05           135
# 6 2008-10-06           222

数据

代码语言:javascript
运行
复制
set.seed(42)
df1 <- data.frame(total_snow_cm=sample(120:240, 4018, replace=TRUE),
                  year=seq(as.Date("2000-01-01"),as.Date("2010-12-31"), by="day"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57023672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档