在R中按code、tmp分组计算wek=1与wek=2的sbd变量差值
R语言实现分组计算特定wek值的sbd差值
核心逻辑
你需要的差值不是连续行差值,而是同一code、tmp分组下wek=2对应的sbd值减去wek=1对应的sbd值,由于同分组同wek下的sbd值全部重复,直接提取两类wek的sbd值做差即可。
方案1:tidyverse(dplyr)实现(推荐)
生成带差值的完整数据集
如果需要把差值填充到原数据集的每一行,使用mutate:
library(dplyr) # 把df替换为你的实际数据集名称 df_with_diff <- df %>% group_by(code, tmp) %>% # 取对应wek的第一个sbd值做差,避免重复值干扰 mutate(sbd_diff = sbd[wek == 2][1] - sbd[wek == 1][1]) %>% ungroup()
生成分组差值汇总表
如果只需要每个分组的差值结果,使用summarise:
df_diff_summary <- df %>% group_by(code, tmp) %>% summarise( sbd_wek1 = unique(sbd[wek == 1]), sbd_wek2 = unique(sbd[wek == 2]), sbd_diff = sbd_wek2 - sbd_wek1, .groups = "drop" )
方案2:base R实现
不需要加载第三方包,用ave函数实现差值填充:
df$sbd_diff <- ave( 1:nrow(df), df$code, df$tmp, FUN = function(idx) { sub <- df[idx, ] sub$sbd[sub$wek == 2][1] - sub$sbd[sub$wek == 1][1] } )
注意:如果你的实际数据中存在同一(code, tmp, wek)分组下sbd值不唯一的情况,可先做聚合(比如取均值mean(sbd)、中位数median(sbd))再计算差值,避免结果出错
内容的提问来源于stack exchange,提问作者psycho95
相关产品推荐
相关产品推荐

