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
相关产品推荐
相关产品推荐

