R语言中分组统计后将结果映射回原数据集的实现方法
R语言:分组计算统计值后映射回原数据每一行
当然可以实现,主要有两种常用方法:
方法1:用mutate替代summarise(推荐)
summarise会将每个分组压缩为一行,而mutate会保留原数据的所有行,同时将分组计算的结果填充到该组的每一行中,直接得到你想要的结果。
代码示例
library(dplyr) # 定义原数据集 base <- data.frame( ID = c(1,1,2,2,3,3), location = c("a","a","b","d","c","c"), value = c(5,2,3,1,2,3) ) # 分组计算并保留原行 result <- base %>% group_by(ID, location) %>% mutate(estimated = sum(value)) %>% rename(`original value` = value) %>% ungroup() # 可选:解组,恢复普通dataframe结构 print(result)
输出结果
| ID | location | original value | estimated |
|---|---|---|---|
| 1 | a | 5 | 7 |
| 1 | a | 2 | 7 |
| 2 | b | 3 | 3 |
| 2 | d | 1 | 1 |
| 3 | c | 2 | 5 |
| 3 | c | 3 | 5 |
方法2:先聚合再关联(适用于已有聚合结果的场景)
如果已经通过summarise得到了分组统计结果,可以用left_join基于分组键(ID和location)将统计值合并回原数据。
代码示例
library(dplyr) # 原数据集 base <- data.frame( ID = c(1,1,2,2,3,3), location = c("a","a","b","d","c","c"), value = c(5,2,3,1,2,3) ) # 先分组求和得到聚合结果 grouped_sum <- base %>% group_by(ID, location) %>% summarise(estimated = sum(value), .groups = "drop") # 关联回原数据 result <- base %>% rename(`original value` = value) %>% left_join(grouped_sum, by = c("ID", "location")) print(result)
输出结果
与方法1完全一致。
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

