如何在R中实现分组统计并将结果映射至原数据的每一行?
解决方法
你需要用**mutate()**替代summarize(),因为mutate()会保留原数据的所有行,并将分组计算的结果填充到对应组的每一行中,而不是压缩分组。
方法一:使用dplyr包(tidyverse生态)
首先构造示例数据:
# 构造原数据框 df <- data.frame( full_name = c("XYZ", "XYZ", "XYZ", "ABC"), flag = c("yes", "missing", "yes", "yes"), stringsAsFactors = FALSE )
然后按分组计算并添加新列:
library(dplyr) df_result <- df %>% group_by(full_name) %>% mutate( num = sum(flag == "yes"), # 统计每组中"yes"的数量 den = n() # 统计每组的总行数 ) %>% ungroup() # 取消分组(可选,根据后续操作需求) print(df_result)
运行后输出结果:
full_name flag num den <chr> <chr> <int> <int> 1 XYZ yes 2 3 2 XYZ missing 2 3 3 XYZ yes 2 3 4 ABC yes 1 1
方法二:使用Base R(无需额外包)
如果不想加载dplyr,可以用ave()函数实现:
# 计算每组"yes"的数量并添加到num列 df$num <- ave(df$flag == "yes", df$full_name, FUN = sum) # 计算每组总行数并添加到den列 df$den <- ave(df$full_name, df$full_name, FUN = length) print(df)
同样会得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Shruti Sikri
相关产品推荐
相关产品推荐

