如何使用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)
代码步骤解释
分组求和:
我们把individual、trait、flag.1、flag.2和year一起作为分组依据,这样就能得到每个个体在对应标记、年份下的quantity总和。.groups = "drop"是为了完成求和后自动取消分组,避免后续操作受到分组状态的影响。长表转宽表:
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
相关产品推荐
相关产品推荐

