计算同一行中开始和结束日期的平均温度(从其他数据集得出)

Calculate average temperature (derived from other dataset) over start and end date in same row

我是R初学者,想计算一段时间内的平均温度。我有两个数据集:

  1. 具有开始日期 (date_fixed) 和结束日期 (date_broken) 的数据集

    ds <- data.frame(  date_fixed= c("16-3-2015", "19-3-2015"), 
                       date_broken = c("18-3-2015", "22-3-2015"))
    
    ds$date_broken <- dmy(ds$date_broken)
    ds$date_fixed <- dmy(ds$date_fixed)
    
  2. 每日温度数据集:

    weather <- data.frame(date = c("16-3-2015", "17-3-2015", "18-3-2015", 
     "19-3-2015", "20-3-2015", "21-3-2015"), temperature = c("10", 
     "11", "12", "11", "12", "11"))
    weather$date <- dmy(weather$date)
    

我想要的输出看起来像这样(抱歉,我不知道如何让它变得漂亮 table)

date_fixed date_broken average_temperature
2015-03-16     2015-03-18  11
2015-03-19    2015-03-22  11,3

提前致谢!

我们可以使用 data.table 中的 foverlaps。将 'ds' 和 'ds2' data.frame 转换为 data.table 并将密钥设置为 'date_fixed' 和 'date_broken'。然后在'data.table'上应用foverlaps,得到'temperature'的mean,按'date_fixed'和'date_broken'分组。

library(data.table)
ds2 <- data.frame(date_fixed=weather$date,
      date_broken = weather$date, temperature = weather$temperature)

setDT(ds2, key = c("date_fixed", "date_broken"))
setDT(ds, key = c("date_fixed", "date_broken") )

foverlaps(ds2, ds)[, .(avg_temp = mean(as.numeric(as.character(temperature)))) ,
            by = .(date_fixed, date_broken)]
#   date_fixed date_broken avg_temp
#1: 2015-03-16  2015-03-18 11.00000
#2: 2015-03-19  2015-03-22 11.33333

注意:'temperature' 列为 factor,因此需要将其转换为 numeric 以计算平均值。


或使用base R

ds$avg_temp <-  unlist(Map(function(x,y) with(weather, 
        mean(as.numeric(as.character(temperature[date >=x & date <= y])))) , 
        ds$date_fixed, ds$date_broken))

注意 2 : 虽然我们可以使用 > 来做到这一点,但最好坚持使用 foverlaps

我在你的天气中使用了 stringsAsFactors = FALSE data.frame 定义

ds$average_temperature= apply(ds, 1, function(x)  mean(as.numeric(weather[weather$date >= x[1] & weather$date <= x[2],2])) )

使用 lubridate%within%

的另一种可能的解决方案
library(lubridate)
ds$average_Temp <- sapply(interval(ds$date_fixed, ds$date_broken), function(i)
                               mean(weather$temperature[weather$date %within% i]))
ds
#  date_fixed date_broken average_Temp
#1 2015-03-16  2015-03-18     11.00000
#2 2015-03-19  2015-03-22     11.33333

注:我将temp转为numeric如下:

weather$temperature <- as.numeric(as.character(weather$temperature))

使用 data.table, v1.9.7current development version 中最近实现的 non-equi 连接功能,可以按如下方式完成:

require(data.table) #v1.9.7
setDT(weather)[ds, mean(temperature), on=.(date>=date_fixed, date<=date_broken), by=.EACHI]
#          date       date       V1
# 1: 2015-03-16 2015-03-18 11.00000
# 2: 2015-03-19 2015-03-22 11.33333

这假设 temperature 是 numeric/integer 类型(与您问题中的 factor 相对)。