无法计算列百分比?求R语言dplyr代码解决方案
问题原因
你遇到的问题是因为分组后sum(sale_vol)的作用范围被限制在当前分组内:group_by(Property Type)执行后,每组的sale_vol是该类房产的数量,而sum(sale_vol)只会计算当前组的总和(也就是等于该组的sale_vol),所以最终每组的百分比都会是100%。
修正方案
以下是几种可行的修正代码:
方法1:先计算全局总销量再关联
sale <- read_csv("re_sale.csv") # 先筛选出有效数据并计算总数量 total_valid <- nrow(filter(sale, !is.na(`Property Type`))) sale %>% filter(!is.na(`Property Type`)) %>% group_by(`Property Type`) %>% summarize(sale_vol = n()) %>% mutate(percent = round(sale_vol / total_valid * 100, 2)) # 保留两位小数更直观
方法2:分组统计后取消分组再计算百分比
sale <- read_csv("re_sale.csv") sale %>% filter(!is.na(`Property Type`)) %>% group_by(`Property Type`) %>% summarize(sale_vol = n()) %>% ungroup() %>% # 取消分组,让sum作用于所有组的总和 mutate(percent = round(sale_vol / sum(sale_vol) * 100, 2))
方法3:用count简化代码
dplyr的count函数可以直接完成分组计数,再计算百分比:
sale <- read_csv("re_sale.csv") sale %>% filter(!is.na(`Property Type`)) %>% count(`Property Type`, name = "sale_vol") %>% mutate(percent = round(sale_vol / sum(sale_vol) * 100, 2))
以上三种方法都能得到各组房产销量占总有效销量的百分比,你可以根据习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Duy Ha
相关产品推荐
相关产品推荐

