【问题标题】:Summarize R data frame based on a date range in a second data frame根据第二个数据框中的日期范围汇总 R 数据框
【发布时间】:2014-08-21 04:42:35
【问题描述】:

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

一个数据框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 表示特定日期范围内测量的累积降水量。我正在尝试将模型与测量数据进行比较,这需要同步时间段。

所以,我想通过数据框start_dateend_date 之间的日期日期范围来总结数据框precip_daily 中的precip 列(观察计数和precip 的总和)。 @。对最好的方法有什么想法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用 precip_range 中的 start_dates 作为 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
    

    获取每个范围的总数(标有开始日期的范围)

    【讨论】:

    • 谢谢。这非常适合获取 precip 的总和,但如前所述,我还想要每个日期范围内具有 precip 值的行数。我希望这是一个检查 - 以确保我在日期范围内的每一天都有精确值。
    • 也可以table(rng)
    • 或者如果需要一个电话,aggregate(cbind(count=1, sum=precip_daily$precip)~rng, FUN=sum)
    【解决方案2】:

    或者

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2023-03-23
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多