需要计算每年达到(或超过)阈值的次数(使用 R)

Need to count the number of times a threshold value is met (or exceeded) per year (using R)

我正在处理多个温度数据集,并试图在温度达到或超过阈值时退出。理想情况下,我想知道大约 100 年的数据每年达到/超过该值的次数(计数),以及每年首次超过和最后一次超过该值的时间(什么日期)。

数据位于 table(导入 R 的 .csv 文件)中,包含 YR、MO、DA、TMAX 列

对于第一部分,我尝试使用子集来提取温度超过某个值的所有时间,但我仍然必须每年累加(耗时) 子集(数据,TMAX > 20.86)

我已经弄清楚如何使用计数,但这给了我数据集中所有出现的次数 计数(数据,变量 = "TMAX")

我玩过 summarize ,但一无所获。任何帮助将不胜感激 - 特别是对于我的问题的第二部分 - 找到每年的第一次和最后一次出现。

这是示例数据。这是 SeatlleTMAX(而不是数据),因为它是西雅图的 TMAX 值。 YR MO DA TMAX
1909 9 1 28.9
1909 9 2 30.0
1909 9 3 28.3
1909 9 4 33.9
1909 9 5 31.7
1909 9 6 28.3
1909 9 7 26.7
1909 9 8 23.3
1909 9 9 22.2
1909 9 10 17.8
1909 9 11 14.4
1909 9 12 25.6
1909 9 13 23.9
1909 9 14 25.0
1909 9 15 29.4
1909 9 16 28.3
1909 9 17 14.4
1909 9 18 21.7
1909 9 19 14.4
1909 9 20 13.3
1909 9 21 15.6
1909 9 22 20.6
1909 9 23 23.3
1909 9 24 20.0
1909 9 25 21.1
1909 9 26 22.2
1909 9 27 25.6
1909 9 28 22.2
1909 9 29 15.0
1909 9 30 12.2

install.packages("dplyr")
library(dplyr)    
data %>%
  group_by(YR) %>%
  summarize(n_break_threshold=sum(TMAX > 20.86))

这假设您的数据位于名为 datadata.frame 中。这段代码有效的是 "Take data, set it up so that dplyr operations happen on groups of the data.frame composed of the unique values in the variable YR and then run a summarize operation (i.e. one that returns an atomic vector) that counts the number of times the relation TMAX > 20.86 is TRUE."

如果您以前使用过它,您可能会注意到它与 SQL 非常相似。

图书馆(plyr)

数据示例

该示例以两年为周期,并随机选择 0 到 22 之间的温度值。

dat<-seq(as.Date("2013/1/1"), as.Date("2014/12/31"), "days")
DA<-as.numeric(format(dat, "%d"))
MO<-as.numeric(format(dat, "%m"))
YR<-as.numeric(format(dat, "%Y"))
TMAX<-runif(length(dat), 0, 22)

df<-data.frame(dat, DA, MO, YR, TMAX)

Thres=20.86

每个月计数(不考虑年份)

ddply(df, .(MO), summarise, count = sum(TMAX>Thres)) 

每年每个月的计数

ddply(df, .(YR, MO), summarise, count = sum(TMAX>Thres)) 

每年温度超过阈值的第一天

temp<-ddply(df, .(YR, dat), summarise, count = sum(TMAX>Thres)) 
res<-subset(temp, count==1)
ddply(res, .(YR), summarise, min = min(dat))

每年温度超过阈值的最后一天

ddply(res, .(YR), summarise, max = max(dat))

考虑到提供的数据和 OP 的评论,将我的评论调整为答案。请注意,未检查代码,因为未获得 dput 数据。

library("dplyr")

data_summarised <-
    data %>% 
    mutate(date = as.Date(paste(YR, MO, DA, sep = "-"))) %>% # concatenate YR MO DA into an ISO date, convert column into date type 
    filter(TMAX > 20.86) %>%
    group_by(YR) %>%
    summarise(number_of_days = n(), # count number of rows in each group
              first_date = min(date),
              last_date = max(date))