在第二个数据框中基于日期范围总结R数据框。

4
我可以帮您进行翻译。以下是我翻译的结果:

我有两个数据框,一个按天包含数据,另一个按不规则时间间隔包含数据。例如:

一个名为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_range中按日期范围(在start_dateend_date之间)汇总precip_daily数据框中的precip列(观测计数和precip总和)。您有什么想法最好的方法是什么?
2个回答

3

您可以使用precip_rangestart_dates作为分割点,利用cut()函数对每日数值进行分组。例如:

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

在这里,我们使用范围数据框中的开始日期来对每日数值进行裁剪。我们确保包括最低值,并在最大结束值处停止。如果我们将其与每日数值合并,我们会看到

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

为了获得每个日期范围的总数(以开始日期标记的范围),请执行以下操作:

谢谢。这对于获取降水总和非常完美,但正如所示,我还想要每个日期范围内具有降水值的行数。我希望这是一个检查-以确保我在日期范围内每天都有降水值。 - user3791234
也可以直接执行 table(rng) - MrFlick
1
或者如果需要一次调用,则为aggregate(cbind(count=1, sum=precip_daily$precip)~rng, FUN=sum) - MrFlick
从未听说过![聚合中 ~ 的含义是什么?] (http://stackoverflow.com/questions/14078591/what-is-the-meaning-of-in-aggregate) - smci

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接