需要计算每年达到(或超过)阈值的次数(使用 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))
这假设您的数据位于名为 data
的 data.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))
我正在处理多个温度数据集,并试图在温度达到或超过阈值时退出。理想情况下,我想知道大约 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))
这假设您的数据位于名为 data
的 data.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))