首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算数据帧中多个范围的汇总统计信息

计算数据帧中多个范围的汇总统计信息
EN

Stack Overflow用户
提问于 2018-03-06 05:49:05
回答 2查看 44关注 0票数 1

我有一个大的数据框"table“,如下所示:

代码语言:javascript
复制
  Year Month        Model Scenario Longitude Latitude tas_month pr_month
1 2000     1 ccsm4_r1i1p1    rpc45      9.57   -84.53     24.20    40.63
2 2000     2 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.05    54.20
3 2000     3 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.19    36.87
4 2000     4 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.44   126.47
5 2000     5 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.36   282.44
6 2000     6 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.71   284.68

我想创建一个新的数据框,其中包含每个五年期间的mean(tas_month)mean(pr_month),使用group_by(Month, Longitude, Latitude, Model, Scenario)。这个新数据框还必须有一个新列,其中每一行都有这些值所属的5年期间的值。

代码语言:javascript
复制
  Period Month        Model Scenario Longitude Latitude tas_month pr_month
1 1     1 ccsm4_r1i1p1    rpc45      9.57   -84.53     24.20    40.63
2 2     2 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.05    54.20
3 3     3 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.19    36.87
4 4     4 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.44   126.47
5 5     5 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.36   282.44
6 6     6 ccsm4_r1i1p1    rpc45      9.57   -84.53     25.71   284.68

我已经创建了一个周期为五年的向量:

代码语言:javascript
复制
fiveyears <- seq(2000, 2100, 5)

但是仍然不能弄清楚如何计算均值。我在想像这样的“伪”代码,但它仍然很粗糙:

代码语言:javascript
复制
for (i in seq_along(fiveyears)){
  table %>% filter(Year < (i+5) & Year >= i) %>% 
  group_by(Month, Longitude, Latitude, Model, Scenario) %>% 
  summarise(pr_month = mean(pr_month), tas_month = mean(tas_month))

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 06:25:16

您的示例数据仅涉及2000年,因此我们可以使用以下内容:

代码语言:javascript
复制
df <- data.frame(Year = rep(2000:2011, each = 3), x = rnorm(36))

你的想法很好,但我们可以让它更简洁:

代码语言:javascript
复制
df %>% group_by(Year %/% 5) %>% summarize(y = mean(x))
# A tibble: 3 x 2
#   `Year%/%5`      y
#        <dbl>  <dbl>
# 1        400  0.334
# 2        401  0.116
# 3        402 -0.222

其中%/%表示整数除法。如果需要,您可以更改第一个列名并相应地规范化它的值。

更新:

代码语言:javascript
复制
df %>% group_by(Year %/% 5, Month, Longitude, Latitude, Model, Scenario) %>% 
  summarize(tas_month = mean(tas_month), pr_month = mean(pr_month)) %>% 
  rename("Period" = `Year%/%5`) %>% 
  transform(Period = Period - min(df$Year %/% 5) + 1)
#   Period Month Longitude Latitude        Model Scenario tas_month pr_month
# 1      1     1      9.57   -84.53 ccsm4_r1i1p1    rpc45     24.20    40.63
# 2      1     2      9.57   -84.53 ccsm4_r1i1p1    rpc45     25.05    54.20
# 3      1     3      9.57   -84.53 ccsm4_r1i1p1    rpc45     25.19    36.87
# 4      1     4      9.57   -84.53 ccsm4_r1i1p1    rpc45     25.44   126.47
# 5      1     5      9.57   -84.53 ccsm4_r1i1p1    rpc45     25.36   282.44
# 6      1     6      9.57   -84.53 ccsm4_r1i1p1    rpc45     25.71   284.68
票数 2
EN

Stack Overflow用户

发布于 2018-03-06 10:41:44

遵循@Julius的建议,我最终得到了这个。不像我希望的那样干净或优雅,但至少我希望它能给有类似问题的人一些想法:

代码语言:javascript
复制
tbl_month_5years <- table %>% 
  group_by(Year %/% 5, Month, Longitude, Latitude, Model, Scenario) %>%
  summarise(tas_mean = mean(tas_month), pr_mean = mean(pr_month)) %>%
  rename(period = `Year%/%5`)

periods_5years <- tbl_month_5years %>% group_by(period) %>%    
  summarise(n())

years5 <- as.data.frame(seq(2000, 2095, 5))
years5 <-years5 %>% rename(ini_year = `seq(2000, 2095, 5)`)
years5 <- cbind(years5, periods_5years)

tbl_month_5years <- tbl_month_5years %>% 
  left_join(years5, by = "period") %>% select(-`n()`)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49120052

复制
相关文章

相似问题

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