如何使用group_by()和summarize()统计数据点出现次数并解决计数错误
错误原因
你对dplyr的count()函数的使用场景理解错误:
count()本质是对输入数据框做分组+计数的封装函数,返回的是带分组键和频次列的新数据框,不是可用于summarize()的单值聚合函数- 当前代码里按x分组后调用
count(x)返回正确结果纯属巧合:每个x分组内所有行的x值唯一,count(x)返回的恰好是当前分组的行数,刚好等于该x值的出现次数;但count(y)、count(z)统计的是当前x分组内y、z列的频次表,只会返回第一个匹配值的计数,完全不符合你的统计需求,因此出现了D未被统计、z列出现不存在的A的计数这类逻辑错误。
解决方案
根据你提到的「统计数据集各列不同因子的出现次数」的需求,分两种常见场景给出实现代码:
场景1:不分组,统计全表三列所有因子的总出现次数
library(tidyverse) p <- data.frame(x = c("A", "B", "C", "A", "B"), y = c("A", "B", "D", "A", "B"), z = c("B", "C", "B", "D", "E")) # 转换为长表后统一统计所有因子频次 p %>% pivot_longer(everything(), names_to = "所属列", values_to = "因子值") %>% count(所属列, 因子值, name = "出现次数")
运行后会输出所有列所有因子的完整统计结果,不会遗漏D、E等特殊值。
场景2:保留按x分组的逻辑,统计每个x分组下y、z列各因子的出现次数
p %>% group_by(x) %>% summarise( y列统计 = list(enframe(table(y), name = "y因子值", value = "出现次数")), z列统计 = list(enframe(table(z), name = "z因子值", value = "出现次数")) ) %>% unnest(y列统计) %>% unnest(z列统计)
运行后会输出每个x分组下,y、z列所有因子的对应计数,不会出现统计错位的问题。
内容的提问来源于stack exchange,提问作者ellieanderson
相关产品推荐
相关产品推荐

