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

如何使用dplyr按条件聚合数据:按年份汇总quantity列

解决方案:用dplyr+tidyr实现长表转宽并分组聚合

这其实是典型的长表转宽表需求,结合分组聚合就能轻松实现。我们可以用dplyr做分组求和,再搭配tidyr的pivot_wider函数完成格式转换,完全符合你想要的输出结果。

完整实现代码

# 先加载需要的包
library(dplyr)
library(tidyr)

# 执行数据处理流程
result_df <- df %>%
  # 按个体、特征、标记变量+年份分组,计算每组的quantity总和
  group_by(individual, trait, flag.1, flag.2, year) %>%
  summarise(sum_quantity = sum(quantity), .groups = "drop") %>%
  # 将长表转为宽表,自动填充缺失年份的数值为0
  pivot_wider(
    names_from = year,          # 用year的取值作为新列名的一部分
    values_from = sum_quantity, # 用求和后的数值填充新列
    names_prefix = "sum.quantity.year.", # 给新列添加指定前缀
    values_fill = 0             # 没有对应年份数据的行填充0
  )

# 查看结果
print(result_df)

代码步骤解释

  1. 分组求和:
    我们把individual、trait、flag.1、flag.2和year一起作为分组依据,这样就能得到每个个体在对应标记、年份下的quantity总和。.groups = "drop"是为了完成求和后自动取消分组,避免后续操作受到分组状态的影响。

  2. 长表转宽表:
    pivot_wider是实现格式转换的核心:

    • names_from = year:指定用year列的不同取值("1"和"2")来生成新的列名。
    • names_prefix = "sum.quantity.year.":给新生成的列加上你需要的前缀,让列名完全匹配预期格式。
    • values_fill = 0:对于像ind.1这样没有year=1记录的分组,自动填充0,正好满足你要求的结果。

运行结果

执行代码后会得到你想要的数据框:

# A tibble: 3 × 6
  individual trait  flag.1 flag.2 sum.quantity.year.1 sum.quantity.year.2
  <fct>      <fct>  <fct>  <fct>                <int>                <int>
1 ind.1      blue   1      0                        0                   10
2 ind.2      green  0      0                       13                   62
3 ind.3      yellow 1      1                        9                   14

内容的提问来源于stack exchange,提问作者Lorcán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:45:09