如何基于现有DataFrame行新增汇总行?dplyr实现方案咨询
使用dplyr实现按国家汇总分数并添加汇总行
没问题,用dplyr来实现这个需求非常简洁,我给你一步步拆解怎么做:
1. 先构造原始数据
首先我们先还原你给出的原始数据集,用tibble创建符合tidyverse风格的数据框:
library(dplyr) # 构造原始数据 df <- tibble( Type = c(rep("University", 3), rep("College", 3)), Country = rep(c("Australia", "Brazil", "Hong Kong"), 2), Score = rep(10, 6) )
2. 生成按国家汇总的行
接下来按Country分组,计算每个国家的总分,同时把Type列标记为All:
# 生成汇总数据 summary_df <- df %>% group_by(Country) %>% summarise( Type = "All", Score = sum(Score), .groups = "drop" # 取消分组,避免后续操作受分组残留影响 )
这里的.groups = "drop"很关键,它会在汇总后自动取消分组,防止后续合并数据时出现意外问题。
3. 合并原始数据与汇总数据
最后用bind_rows把原始数据和汇总数据合并,再调整顺序让结果和你期望的一致:
# 合并并调整顺序 final_df <- bind_rows(df, summary_df) %>% # 给Type列设置排序优先级,确保顺序是University → College → All mutate(Type_order = case_when( Type == "University" ~ 1, Type == "College" ~ 2, Type == "All" ~ 3 )) %>% arrange(Country, Type_order) %>% select(-Type_order) # 移除临时排序列
查看最终结果
运行上述代码后,打印final_df就能得到你想要的输出:
print(final_df) #> # A tibble: 9 × 3 #> Type Country Score #> <chr> <chr> <dbl> #> 1 University Australia 10 #> 2 College Australia 10 #> 3 All Australia 20 #> 4 University Brazil 10 #> 5 College Brazil 10 #> 6 All Brazil 20 #> 7 University Hong Kong 10 #> 8 College Hong Kong 10 #> 9 All Hong Kong 20
整个过程完全用dplyr的管道语法实现,比循环更简洁易读,也符合tidy数据的处理习惯。
内容的提问来源于stack exchange,提问作者fanbondi
相关产品推荐
相关产品推荐

