我有一个包含每日平均温度数据的数据框,其结构如下:
'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/