如何按date1、car分组计算side A与B对应的measure绝对差值
实现方案
以下两种方案均可满足需求,均基于tidyverse生态实现:
方案1:宽表转换法(可读性更高,适合需要同时保留A、B侧原始值的场景)
# 加载依赖包 library(dplyr) library(tidyr) result <- test %>% # 将side字段的A、B转为单独列,列值为对应measure pivot_wider(names_from = side, values_from = measure) %>% # 计算绝对差值 mutate(abs.difference.side = abs(A - B)) %>% # 筛选出需要的输出字段 select(date1, car, abs.difference.side)
方案2:分组直接计算法(无需转表,运行效率更高,适合大数据量场景)
该方案默认每个date1+car的分组下,side为A、B的记录各仅有1条,符合你给出的业务场景特征:
library(dplyr) result <- test %>% # 按日期、车辆分组 group_by(date1, car) %>% # 直接提取分组内A、B侧的measure计算差值,.groups = "drop"用于汇总后自动取消分组 summarise(abs.difference.side = abs(measure[side == "A"] - measure[side == "B"]), .groups = "drop")
注意事项
如果实际数据中存在某date1+car分组下缺失A或B侧记录的情况,计算结果会返回NA,你可以根据业务需要在代码中增加filter步骤提前过滤掉不完整的分组。
内容的提问来源于stack exchange,提问作者DR15
相关产品推荐
相关产品推荐

