2014-06-30 28 views
4

我有两个数据帧,一个包含白天的数据,另一个包含不规则的时间多天间隔的数据。例如:在第二个数据帧中基于日期范围总结R数据帧

由不规则的时间间隔与降水数据的数据帧precip_range

start_date<-as.Date(c("2010-11-01", "2010-11-04", "2010-11-10")) 
end_date<-as.Date(c("2010-11-03", "2010-11-09", "2010-11-12")) 
precipitation<-(c(12, 8, 14)) 
precip_range<-data.frame(start_date, end_date, precipitation) 

和数据帧precip_daily每日降水数据:

day<-as.Date(c("2010-11-01", "2010-11-02", "2010-11-03", "2010-11-04", "2010-11-05", 
        "2010-11-06", "2010-11-07", "2010-11-08", "2010-11-09", "2010-11-10", 
        "2010-11-11", "2010-11-12")) 
precip<-(c(3, 1, 2, 1, 0.25, 1, 3, 0.33, 0.75, 0.5, 1, 2)) 
precip_daily<-data.frame(day, precip) 

在这个例子中,precip_daily每日表示通过模型估算的降水量和precip_range表示特定日期范围的测量累积降水量。我试图将模型与测量数据进行比较,这需要同步时间段。

所以,我想总结数据帧precip_daily由日期的日期范围start_dateend_date之间的precip柱(观测的计数和的precip总和)在所述数据帧precip_range。任何关于最佳方式的想法?

回答

3

您可以使用从precip_range开始的日期作为到cut()的中断来对日常值进行分组。例如,

rng <- cut(precip_daily$day, 
    breaks=c(precip_range$start_date, max(precip_range$end_date)), 
    include.lowest=T) 

这里我们使用数据范围data.frame中的开始日期在每天剪切值。我们一定要包括最低价值,并停止在最大的最终价值。如果我们将其与日常值合并,我们将看到

cbind(precip_daily, rng) 

#   day precip  rng 
# 1 2010-11-01 3.00 2010-11-01 
# 2 2010-11-02 1.00 2010-11-01 
# 3 2010-11-03 2.00 2010-11-01 
# 4 2010-11-04 1.00 2010-11-04 
# 5 2010-11-05 0.25 2010-11-04 
# 6 2010-11-06 1.00 2010-11-04 
# 7 2010-11-07 3.00 2010-11-04 
# 8 2010-11-08 0.33 2010-11-04 
# 9 2010-11-09 0.75 2010-11-04 
# 10 2010-11-10 0.50 2010-11-10 
# 11 2010-11-11 1.00 2010-11-10 
# 12 2010-11-12 2.00 2010-11-10 

它表明这些值已被分组。然后,我们可以做

aggregate(cbind(count=1, sum=precip_daily$precip)~rng, FUN=sum) 

#   rng count sum 
# 1 2010-11-01  3 6.00 
# 2 2010-11-04  6 6.33 
# 3 2010-11-10  3 3.50 

以获得每个这些范围的总

+0

谢谢(如开始日期标记的范围)。这对于得到降水量的总和非常合适,但是如上所示,我还希望每个日期范围内降水量的行数。我希望这是一个检查,以确保在日期范围内每天都有降水值。 – user3791234

+0

只要做'table(rng)'。 – MrFlick

+1

或者如果它需要一个调用,'聚合(cbind(count = 1,sum = precip_daily $ precip)〜rng,FUN = sum)' – MrFlick

1

或者

library(zoo) 
library(data.table) 
temp <- merge(precip_daily, precip_range, by.x = "day", by.y = "start_date", all.x = T) 
temp$end_date <- na.locf(temp$end_date) 
setDT(temp)[, list(Sum = sum(precip), Count = .N), by = end_date] 

##  end_date Sum Count 
## 1: 2010-11-03 6.00  3 
## 2: 2010-11-09 6.33  6 
## 3: 2010-11-12 3.50  3