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

无需使用pivot_wider,基于D类别计算A/B/C类别的营收差值

问题描述

需处理一个含多列的DataFrame,要求将A、B、C类别的同产品营收减去D类别的对应产品营收,同时保留D类别的原始营收值。因实际数据量较大且需多次执行该操作,当前基于pivot_wider+pivot_longer的实现效率偏低,现寻求更高效的处理方案。

示例输入

product category revenue
0001    A        78
0001    B        98
0001    C        103
0001    D        95
0002    A        81
...     ...      ...

预期输出

product category revenue
0001    A        -7
0001    B        3
0001    C        8
0001    D        95
...     ...      ...

当前低效实现代码

df = df %>% pivot_wider(names_from = category, values_from = revenue)
df[,2:4] = df[,2:4] - df$D %>% as.data.frame()
df = df %>% pivot_longer(2:5, names_to = 'category', values_to = 'revenue')
高效实现方案

以下两种方案均无需进行宽表/长表转换,直接在原数据结构上完成计算,既能保留所有原有列,又大幅提升处理效率:

方法1:dplyr分组处理

适合常规数据规模,代码简洁易读:

library(dplyr)

df <- df %>%
  group_by(product) %>%
  mutate(
    revenue = case_when(
      category %in% c("A", "B", "C") ~ revenue - revenue[category == "D"],
      TRUE ~ revenue
    )
  ) %>%
  ungroup()

核心逻辑:按product分组,在组内提取D类别的营收值,对A/B/C类营收做减法,其余类别保持原值。

方法2:data.table实现(大数据场景首选)

针对超大规模数据,data.table的内存效率和运算速度优势显著:

library(data.table)

setDT(df)
df[category %in% c("A", "B", "C"), 
   revenue := revenue - df[.SD, on = .(product, category = "D"), x.revenue]]

核心逻辑:通过行匹配直接定位同产品的D类营收,批量更新A/B/C类的营收值,全程避免数据结构转换,内存占用极低。


内容的提问来源于stack exchange,提问作者Théodore Targerian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:47:45