R计算每年超过的天数

时间:2015-02-26 10:10:57

标签: r count time-series aggregate plyr

我的目标是计算每个数据帧列的每年超标天数。我希望使用整个数据帧的一个固定值以及每列的不同值来执行此操作。对于整个数据框的一个固定值,我找到了一个使用的解决方案,另一个使用包的解决方案。但我无法弄清楚如何使用每列的不同值来做到这一点。

获得一个固定值:

# create example data
date <- seq(as.Date("1961/1/1"), as.Date("1963/12/31"), "days") # create dates
date <- date[(format.Date(as.Date(date), "%m %d") !="02 29")]   # delete leap days 
TempX <- rep(airquality$Temp, length.out=length(date))
TempY <- rep(rev(airquality$Temp), length.out=length(date))
df <- data.frame(date, TempX, TempY)

# This approachs works fine for specific values using aggregate.
library(plyr)
dyear <- as.numeric(format(df$date, "%Y"))                      # year vector
fa80 <- function (fT) {cft <- count(fT>=80); return(cft[2,2])}; # function for counting days of exceedance
aggregate(df[,-1], list(year=dyear), fa80)                      # use aggregate to apply function to dataframe

# Another approach using ddply with colwise, which works fine for one specific value.
fd80 <- function (fT) {cft <- count(fT>=80); cft[2,2]}; # function to count days of exceedance
ddply(cbind(df[,-1], dyear), .(dyear), colwise(fd80))   # use ddply to apply function colwise to dataframe

为了分别使用每列的特定值,我尝试将第二个参数传递给函数,但这不起作用。

# pass second argument to function
Oc <- c(80,85)  # values 
fo80 <- function (fT,fR) {cft <- count(fT>=fR); return(cft[2,2])}; # function for counting days of exceedance
aggregate(df[,-1], list(year=dyear), fo80, fR=Oc)                  # use aggregate to apply function to dataframe

我尝试使用,但它不适用于。我想避免使用,因为它很慢,而且我有很多带有&gt;的数据帧。要处理的100列和长时间序列。

此外,该方法还必须适用于数据帧。

# subset of dataframe
dfmay <- df[(format.Date(as.Date(df$date),"%m")=="05"),]         # subset dataframe - only may
dyearmay <- as.numeric(format(dfmay$date, "%Y"))                 # year vector
aggregate(dfmay[,-1],list(year=dyearmay),fa80)                   # use aggregate to apply function to dataframe

我没有想法,如何解决这个问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

#set the target temperature for each column
targets<-c(80,80)
dyear <- as.numeric(format(df$date, "%Y"))

#for each row of the data, check if the temp is above the target limit
#this will return a matrix of TRUE/FALSE          
exceedance<-t(apply(df[,-1],1,function(x){x>=targets}))

#aggregate by year and sum
aggregate(exceedance,list(year=dyear),sum)