如何在data.table中计算分组均值的跨组累积和并重复填充
用data.table计算跨日期的温度均值累积和并填充到对应行
问题描述
我有一组按半小时间隔采集的时间序列温度测量数据,为简化处理,将datetime变量用数值替代。已使用data.table按date分组计算出每日温度均值T_mean_daily,现需计算这些每日均值的跨组累积和,并像T_mean_daily一样,将每个date对应的累积和值重复填充到该date的所有datetime行中(非组内累积求和)。
示例数据生成代码:
library(data.table) # 生成模拟数据 dt <- data.table(datetime = seq(1, 10.9, by = 0.1), date = rep(1:10, each = 10), T = floor(runif(100, 1, 10))) # 计算每日温度均值 dt[, T_mean_daily := mean(T), by = date]
期望输出样式:
datetime date T T_mean_daily T_sum 1: 1.0 1 4 5.6 5.6 2: 1.1 1 6 5.6 5.6 ... 11: 2.0 2 2 3.6 9.2 12: 2.1 2 5 3.6 9.2 ...
解决方案
方法一:分步实现
# 1. 提取每个date的唯一均值并计算跨日期累积和 cum_sum_dt <- dt[, .(T_mean_daily = first(T_mean_daily)), by = date][, T_sum := cumsum(T_mean_daily)] # 2. 将累积和匹配回原数据表,自动填充对应date的所有行 dt <- dt[cum_sum_dt, on = .(date), T_sum := i.T_sum]
方法二:链式简洁写法
dt[, T_sum := { # 获取唯一的date-均值组合并计算累积和 cum_vals <- unique(.SD[, .(date, T_mean_daily)])[, cumsum(T_mean_daily)] # 匹配每个date对应的累积和值 cum_vals[match(date, unique(date))] }, by = NULL]
代码说明
- 两种方法核心逻辑一致:先获取每个
date对应的唯一每日均值,计算其跨日期的累积和,再将累积和值匹配回原表的对应date行,实现批量填充。 - 方法一通过独立生成累积和数据表再连接,逻辑清晰易读;方法二用链式操作在原表内完成计算,代码更紧凑。
内容的提问来源于stack exchange,提问作者TBP
相关产品推荐
相关产品推荐

