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

时间:2015-02-10 05:58:34

标签: r count subset

我正在处理几个温度数据集并尝试在温度达到或超过阈值时拉出。理想情况下,我想知道每年约100次数据达到/超过该值的次数(次数)以及每年首次超过和最后超过该值的时间(何时)。

数据在表格中(.csv文件带入R),列YR,MO,DA,TMAX

对于第一部分,我尝试使用子集来拉出温度超过一个值的所有时间但是我仍然需要每年加起来(耗费时间) 子集(数据,TMAX> 20.86)

我已经弄清楚了如何使用count,但这给了我数据集中的所有事件 count(data,vars =“TMAX”)

我玩过总结,但没有在哪里。任何帮助都会受到赞赏 - 特别是对于我的问题的第二部分 - 每年发现第一次和最后一次。

以下是示例数据。这是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

3 个答案:

答案 0 :(得分:2)

根据提供的数据和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))

答案 1 :(得分:1)

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

这假设您的数据位于名为data.frame的{​​{1}}中。此代码有效说明的是“Take data,设置它以便data操作发生在dplyr的组中,这些组由变量data.frame中的唯一值组成,然后运行汇总操作(即返回原子矢量的操作),计算关系YRTMAX > 20.86的次数。“

如果您之前使用过,那么您可能会注意到这与TRUE非常相似。

答案 2 :(得分:0)

库(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))