R按日期计算循环并放入新的数据框/矩阵

时间:2014-10-09 15:07:17

标签: r date loops

我有一个包含7,994,625个42个变量的数据库。它基本上是每15分钟从多个站点取得的水质参数,持续1到12年,具体取决于站点......

这是数据帧的负责人:

    STATION       DATE       Time SONDE Layer TOTAL_DEPTH TOTAL_DEPTH_A BATT BATT_A   WTEMP WTEMP_A SPCOND SPCOND_A

1 CCM0069 2001-05-01 09:45:52     AMY    BS          NA           NND 11.6   <NA> 19.32    <NA>  0.387     <NA>
2 CCM0069 2001-05-01 10:00:52     AMY    BS          NA           NND 11.5   <NA> 19.51    <NA>  0.399     <NA>
3 CCM0069 2001-05-01 10:15:52     AMY    BS          NA           NND 11.5   <NA> 19.49    <NA>  0.407     <NA>
4 CCM0069 2001-05-01 10:30:52     AMY    BS          NA           NND 11.5   <NA> 19.34    <NA>  0.428     <NA>
5 CCM0069 2001-05-01 10:45:52     AMY    BS          NA           NND 11.5   <NA> 19.42    <NA>  0.444     <NA>
6 CCM0069 2001-05-01 11:00:52     AMY    BS          NA           NND 11.5   <NA> 19.31    <NA>  0.460     <NA>
 SALINITY SALINITY_A DO_SAT DO_SAT_A   DO DO_A   PH PH_A TURB_NTU TURB_NTU_A FLUOR FLUOR_A TCHL_PRE_CAL
1     0.19       <NA>   97.8     <NA> 9.01 <NA> 7.24 <NA>     19.5       <NA>   9.6    <NA>         63.4
2     0.19       <NA>   99.7     <NA> 9.14 <NA> 7.26 <NA>     21.1       <NA>   9.5    <NA>         63.2
 3     0.20       <NA>   99.3     <NA> 9.11 <NA> 7.23 <NA>     19.2       <NA>   9.7    <NA>         64.3
4     0.21       <NA>   98.4     <NA> 9.05 <NA> 7.23 <NA>     20.0       <NA>  10.2    <NA>         67.6
5     0.21       <NA>   99.2     <NA> 9.12 <NA> 7.23 <NA>     21.2       <NA>  10.4    <NA>         68.7
6     0.22       <NA>   98.7     <NA> 9.09 <NA> 7.23 <NA>     18.3       <NA>  11.0    <NA>         72.5
  TCHL_PRE_CAL_A CHLA CHLA_A COMMENTS month year day
1           <NA> <NA>   <NA>     <NA>   May 2001   1
2           <NA> <NA>   <NA>     <NA>   May 2001   1
3           <NA> <NA>   <NA>     <NA>   May 2001   1
4           <NA> <NA>   <NA>     <NA>   May 2001   1
5           <NA> <NA>   <NA>     <NA>   May 2001   1
6           <NA> <NA>   <NA>     <NA>   May 2001   1

我一直都是R帮助网站并发现了类似的问题,但当我尝试将它们添加到我的数据框中时没有骰子

我试图这样做 按日期循环并计算DO观察总数,DO降至5 mg / l以下,然后计算失败率为5mg / l。我可以在整个数据集上执行此操作,并将每个工作站和日期单独分配,但需要在循环中执行此操作并将结果放入带有其他参数计算的新数据框中......我想我只需要一个良好的开端..

这是我想到的一点点。

x <- levels(sub$DATE)
for(i in 1:length(x)){


 x$c<-(sum(!is.na(x$DO)))/4  # number of DO measurements and put into hours(every 15 mins)
  x$dur<-(sum(x$DO<= 5))/4  # number of DO measurement under 5 mg/l and put into hours
x$fail<-(x$dur/x$c)*100    # failure rate at station and day

}

我得到关于原子矢量的错误代码

我最终想要的是这个

station      date        c  dur       fail
  HGD2115   5/1/2001    24  5   20.83333333
  HGD2115   5/2/2001    22  20  90.90909091
  HGD2115   5/3/2001    24  12  50
  JLD5564   5/1/2001    20  6   30
  JLD5564   5/2/2001    12  2   16.66666667
  JLD5564   5/3/2001    23  5   21.73913043

我需要做更多的计算并添加到新的数据框中,例如每月最小值和盐度,温度等等...希望我不会再回来寻求帮助。我只需要一些建议并推进正确的方向。

最终我会因为没有足够的DO测量而浪费时间而变得疯狂!

2 个答案:

答案 0 :(得分:1)

这看起来像你在问什么(??)

# create sample dataset - you have this already
# 100 stations, 10 days, 15-minute intervals = 100*10*24*4
library(stringr)  # for str_pad(...) in example only - you don't need this
set.seed(1)       # for reproducible example...
data   <- data.frame(STATION=paste0("CMM",str_pad(rep(1:100,each=4*24*10),3,pad="0")),
                     DATE   = as.POSIXct("2001-05-01")+seq(0,15*60*24*1000,len=4*24*1000),
                     DO     = rpois(4*24*1000,5))

# you start here
result <- aggregate(DO~as.Date(DATE)+STATION,data,function(x) {
  count    <- sum(!is.na(x))
  fail     <- sum(x[!is.na(x)]<5)
  pct.fail <- 100*fail/count
  c(count,fail,pct.fail)
})
result <- data.frame(result[,1:2],result[,3])
colnames(result) <- c("DATE","STATION","COUNT","FAIL","PCT.FAIL")
head(result)
#         DATE STATION COUNT FAIL PCT.FAIL
# 1 2001-05-01  CMM001   320  147 45.93750
# 2 2001-05-02  CMM001   384  163 42.44792
# 3 2001-05-03  CMM001   256  119 46.48438
# 4 2001-05-03  CMM002   128   61 47.65625
# 5 2001-05-04  CMM002   384  191 49.73958
# 6 2001-05-05  CMM002   384  168 43.75000

这使用所谓的公式接口aggregate(...)到子集data按日期(使用as.Date(DATE))和STATION。对于每个子组,列DO将传递给函数,该函数会像您一样计算count,fail和pct.fail。

aggregate(...)中的函数返回一个向量时,结果是一个数据框,其中 3 列,一个用于日期,一个用于工作站,另一个包含矢量的结果。但是您希望这些在单独的列中(因此,在您的情况下总共5列)。这一行:

result <- data.frame(result[,1:2],result[,3])

这样做。

答案 1 :(得分:0)

使用聚合解决方案稍有不同。不是在聚合函数内部具有关系运算符,而是使第二数据集仅由满足要求的数据组成(DO <5)。

set.seed(5)
samp_times<- seq(as.POSIXct("2014-06-01 00:00:00", tz = "UTC"), 
                 as.POSIXct("2014-12-31 23:45:00", tz = "UTC"), 
                 by = 60*15)
ntimes=length(samp_times)
nSta<-15
sta<-vector(nSta,mode="any")
for (iSta in seq(1,nSta)) {
  sta[iSta] <- paste(paste(sample(letters,3), collapse = ''), sample(1000:9999, 1), sep="")
}
df<-data.frame(DATETIME=rep(rep(samp_times,each=nSta)), STATION=sta, DO=runif(ntimes*nSta,.1,10))
df$DATE<-strftime(df$DATETIME, format="%Y-%m-%d")
df$TIME<-strftime(df$DATETIME, format="%H:%M:%S")

head(df,20)
do_small = 5
agr_1 <- aggregate(df$DO,list(station=df$STATION,date=df$DATE),length)
dfSmall <- df[df$DO<=do_small,]
agr_2 <- aggregate(dfSmall$DO,list(station=dfSmall$STATION,date=dfSmall$DATE),length)
names(agr_1)[3]="nDO"
names(agr_2)[3]="nDO_Small"

agr <- merge(agr_1,agr_2)
agr$pcnt_DO_SMALL <- agr$nDO_Small / agr$nDO * 100

head(agr)