基于两列值对DataFrame行求和的R语言技术问题
按年份和物种汇总公吨数的dplyr解决方案
问题描述
需要对DataFrame按Year(年份)和Species.Name(物种名称)分组,忽略Division(分区)列,汇总Metric.Tonnes(公吨数)的总和。
原始数据
| Year | Division | Species.Name | Metric.Tonnes |
|---|---|---|---|
| 1960 | 1A | Cod | 300 |
| 1960 | 1B | Cod | 200 |
| 1960 | 1A | Prawn | 50 |
| 1960 | 1B | Prawn | 100 |
| 1961 | 1A | Cod | 300 |
| 1961 | 1B | Cod | 200 |
| 1961 | 1A | Prawn | 50 |
| 1961 | 1B | Prawn | 100 |
期望输出
| Year | Species.Name | Metric.Tonnes |
|---|---|---|
| 1960 | Cod | 500 |
| 1960 | Prawn | 150 |
| 1961 | Cod | 500 |
| 1961 | Prawn | 150 |
尝试的错误代码
df %>% group_by(Year,Species.Name) %>% dplyr::summarise(across(Metric.Tonnes),sum)
解决方案
错误原因
代码中across的语法使用错误,across的正确格式是across(目标列, 应用函数),你将求和函数sum放在了across括号之外,导致语法不合法。
正确写法
方法1:修正across的用法
df %>% group_by(Year, Species.Name) %>% dplyr::summarise(across(Metric.Tonnes, sum), .groups = "drop")
方法2:直接对单列求和(更简洁)
因为仅需对Metric.Tonnes一列求和,不需要使用across,直接调用sum函数更直观:
df %>% group_by(Year, Species.Name) %>% dplyr::summarise(Metric.Tonnes = sum(Metric.Tonnes), .groups = "drop")
补充说明
.groups = "drop"参数用于取消分组状态,将结果转换为普通DataFrame,避免后续操作受分组影响;若不需要可以省略,但推荐添加。- 两种方法都能生成你需要的汇总表格,方法2在单列汇总场景下更易读。
内容的提问来源于stack exchange,提问作者Fish_Person
相关产品推荐
相关产品推荐

