我有一个包含每日平均温度数据的数据框,其结构如下:

 'data.frame':  4666 obs. of  6 variables:
 $ Site : chr  "EB" "FFCE" "IB" "FFCE" ...
 $ Date : Date, format: "2013-01-01" "2013-01-01" "2013-01-01" "2014-01-01" ...
 $ Day  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Year : int  2013 2013 2013 2014 2014 2014 2014 2015 2015 2015 ...
 $ Month: int  1 1 1 1 1 1 1 1 1 1 ...
 $ Temp : num  28.5 28.3 28.3 27 27.8 ...

我正在尝试生成一个汇总表,该表仅汇总每个站点一年中超出某些温度阈值(例如25c,26c)的天数。
我可以像这样使用dplyr手动实现此目的-
Days_above = Site_Daily_average %>%
  group_by(Year, Site) %>%
  summarise("23" = sum(Temp > 23), "24" = sum(Temp > 24),"25"= sum(Temp >
25), "26"= sum(Temp > 26),  "27"= sum(Temp > 27), "28"= sum(Temp > 28), "29"
= sum(Temp > 29),"30"= sum(Temp > 30), "31" = sum(Temp > 31), "ABOVE
THRESHOLD" = sum(Temp > maxthreshold))%>% as.data.frame()

产生一个像这样的表:
   Year Site  23  24  25  26  27  28  29 30 31 ABOVE THRESHOLD
1  2012   EB 142 142 142  91  64  22   0  0  0               0
2  2012 FFCE 238 238 238 210 119  64   0  0  0               0
3  2012   IB 238 238 238 218 138  87   1  0  0               0
4  2013   EB 115 115 115 115 115 109  44  0  0               0
5  2013 FFCE 223 223 216 197 148 114  94  0  0               0
6  2013   IB 365 365 365 348 299 194 135  3  0               0

...

但是,如您所见,代码相当冗长。我遇到的问题是针对一系列温度阈值产生相同的输出,即Tempclasses = Seq(16,32,0.25)。

如您所见,手动输入该信息会花费很长时间。我觉得这是一个非常简单的计算,应该有使用dplyr的方法来识别序列向量中的每个变量,执行此功能并以完整的表格格式生成输出。抱歉,如果我不清楚,因为我是R的新手,
任何建议都将受到欢迎,谢谢。

最佳答案

这是一种tidyverse方法,同样使用mtcars进行说明:

library(tidyverse)

mtcars %>%
  mutate(threshold = cut(mpg,
                         breaks=seq(10, max(mtcars$mpg)+10, 5),
                         labels=seq(10, max(mtcars$mpg)+5, 5))) %>%
  group_by(cyl, threshold) %>%
  tally %>%
  ungroup %>%
  complete(threshold, nesting(cyl), fill=list(n=0)) %>%
  arrange(desc(threshold)) %>%
  group_by(cyl) %>%
  mutate(N_above = cumsum(n)) %>%
  select(-n) %>%
  arrange(cyl, threshold)



如果您想要宽格式的最终​​数据,请在末尾添加spread并删除arrange:
... %>%
select(-n) %>%
spread(threshold, N_above)

关于r - 根据温度阈值向量汇总温度数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50458759/

10-12 22:32