You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何按条件从其他数据框为df列赋值计算区间均值

R语言按日期区间匹配计算均值的实现方法

你不需要先手动给df1匹配ID再聚合,根据数据量大小和使用习惯,可以选下面几种实现方式:

  • 基础R方案(无依赖,逻辑直观)
    直接逐行遍历df2的日期区间,筛选df1中落在区间内的温度值计算均值即可,代码复制就能跑:
df2$mean.temperature <- apply(df2, 1, \(x) {
  s <- as.Date(x["date.pose"])
  e <- as.Date(x["date.withdrawal"])
  mean(df1$temperature[df1$date >= s & df1$date <= e])
})

运行后ID=1对应的均值为(17+30)/2=23.5,和你示例的计算逻辑完全一致。

  • dplyr方案(适合日常用tidyverse的场景,可读性强)
library(dplyr)
df2 <- df2 %>%
  rowwise() %>%
  mutate(mean.temperature = mean(df1$temperature[dplyr::between(df1$date, date.pose, date.withdrawal)])) %>%
  ungroup()
  • data.table非等值连接方案(适合大数据量场景,性能最优)
    如果你原来想先匹配ID再聚合的思路,用非等值连接实现效率最高,不用写循环:
library(data.table)
setDT(df1)
setDT(df2)
# 非等值匹配给df1关联对应区间的ID
df1[df2, ID := i.ID, on = .(date >= date.pose, date <= date.withdrawal)]
# 按ID聚合均值后回写到df2
agg <- df1[, .(mean.temperature = mean(temperature)), by = ID]
df2[agg, mean.temperature := i.mean.temperature, on = "ID"]

注意:你给出的预期结果中date.withdrawal列的取值和初始定义的df2有差异,计算时以你实际的起止日期为准即可,上述代码默认是包含区间首尾日期的计算逻辑,如果需要排除某端调整判断运算符就行。

内容的提问来源于stack exchange,提问作者Jeanne Durivage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 05:49:18