总结基于温度阈值矢量的温度数据

K.w*_*est 6 r dplyr

我有一个数据框,里面有日平均温度数据,结构如下:

 '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 ...
Run Code Online (Sandbox Code Playgroud)

我正在尝试生成一个汇总表,其中总计每个站点一年中的天数超过某些温度阈值,例如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()  
Run Code Online (Sandbox Code Playgroud)

它产生一个像这样的表:

   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
Run Code Online (Sandbox Code Playgroud)

...

但是,你可以看到代码相当冗长.我遇到的问题是为一系列温度阈值产生相同的输出,即Tempclasses = Seq(16,32,0.25).

正如您所看到的那样,需要很长时间才能手动输入.我觉得这是一个非常简单的计算,应该有办法使用dplyr识别序列向量中的每个变量,执行此函数并以完整的表格格式生成输出.对不起,如果不清楚,因为我对R比较新,任何建议都会受到欢迎,谢谢.

eip*_*i10 3

这是一种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)
Run Code Online (Sandbox Code Playgroud)
   threshold cyl N_above
1         10   4      11
2         15   4      11
3         20   4      11
4         25   4       6
5         30   4       4
6         35   4       0
7         10   6       7
8         15   6       7
9         20   6       3
10        25   6       0
11        30   6       0
12        35   6       0
13        10   8      14
14        15   8       8
15        20   8       0
16        25   8       0
17        30   8       0
18        35   8       0
Run Code Online (Sandbox Code Playgroud)

如果您想要宽格式的最终​​数据,请spread在末尾添加 并删除arrange

... %>%
select(-n) %>% 
spread(threshold, N_above)
Run Code Online (Sandbox Code Playgroud)
  cyl 10 15 20 25 30 35
1   4 11 11 11  6  4  0
2   6  7  7  3  0  0  0
3   8 14  8  0  0  0  0
Run Code Online (Sandbox Code Playgroud)