计算同一行中开始和结束日期的平均温度(从其他数据集得出)
Calculate average temperature (derived from other dataset) over start and end date in same row
我是R初学者,想计算一段时间内的平均温度。我有两个数据集:
具有开始日期 (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)
每日温度数据集:
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.7
的 current 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
相对)。
我是R初学者,想计算一段时间内的平均温度。我有两个数据集:
具有开始日期 (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)
每日温度数据集:
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.7
的 current 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
相对)。