如何在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))
思路解析
- 分组逻辑:按
year和country分组,确保我们在同一个年份+国家的组内计算 - 批量处理:用
across(sales:profit)指定需要处理的列范围,实际使用时可替换为列名向量(如c("sales","employees","profit")) - 计算逻辑:对每个列
x,组内总和sum(x)减去当前行的x值,得到的就是同组内其他公司的求和结果 - 列名生成:通过
.names = "other_{.col}"自动生成带other_前缀的新列名,无需手动指定
内容的提问来源于stack exchange,提问作者degeso
相关产品推荐
相关产品推荐

