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

如何在R数据框中批量生成其他组变量求和列?

问题与解决方案

示例数据

我们有如下结构的R数据框:

example_data <- data.frame(
  company   = c(rep("A",6),
                rep("B",6),
                rep("C",6)),
  year      = c(rep(c(rep(c(2019), 3), rep(2020, 3)), 3)),
  country   = c(rep(c("Australia","Tanzania","Nepal"),3)),
  sales     = c(sample(1000:2000, 18)),
  employees = c(sample(100:200, 18)),
  profit    = c(sample(500:1000, 18))
)

打印后的数据示例:

> example_data
   company year   country sales employees profit
1        A 2019 Australia  1815       138    986
2        A 2019  Tanzania  1183       126    907
3        A 2019     Nepal  1159       155    939
4        A 2020 Australia  1873       183    866
5        A 2020  Tanzania  1858       198    579
6        A 2020     Nepal  1841       184    601
7        B 2019 Australia  1989       160    595
8        B 2019  Tanzania  1162       151    520
9        B 2019     Nepal  1470       187    670
10       B 2020 Australia  1013       128    945
11       B 2020  Tanzania  1718       123    886
12       B 2020     Nepal  1135       149    778
13       C 2019 Australia  1846       188    755
14       C 2019  Tanzania  1445       194    916
15       C 2019     Nepal  1029       145    903
16       C 2020 Australia  1737       161    578
17       C 2020  Tanzania  1489       141    859
18       C 2020     Nepal  1350       167    536

需求说明

sales、employees、profit的观测单元是company、year、country的唯一组合。需要为这三个变量(实际数据中约40个)分别生成other_sales、other_employees、other_profit列,值为同year、同country下其他公司对应变量的求和。例如example_data$other_sales[1]应为公司B和C在2019年澳大利亚的sales之和。

错误的尝试代码

尝试用dplyr的group_by()和mutate()实现,但代码存在问题:

library(dplyr)
example_data %>%
 group_by(company, year, country) %>%
 mutate(other_sales = sum(
   example_data %>% filter(company!="this") %>% .$sales)
 )
# "this" 应该指代当前分组的company值

问题点:

  • 分组逻辑错误:不该按company分组,因为我们需要在同year+country组内排除当前公司
  • 无法正确引用当前行的company值
  • 无法批量生成多个目标列

正确解决方案

使用以下代码可以高效实现需求,同时支持批量处理多列:

example_data %>%
  group_by(year, country) %>%
  mutate(across(sales:profit, .names = "other_{.col}", function(x) sum(x)-x))

思路解析

  1. 分组逻辑:按year和country分组,确保我们在同一个年份+国家的组内计算
  2. 批量处理:用across(sales:profit)指定需要处理的列范围,实际使用时可替换为列名向量(如c("sales","employees","profit"))
  3. 计算逻辑:对每个列x,组内总和sum(x)减去当前行的x值,得到的就是同组内其他公司的求和结果
  4. 列名生成:通过.names = "other_{.col}"自动生成带other_前缀的新列名,无需手动指定

内容的提问来源于stack exchange,提问作者degeso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:34