R中不同长度的列能否进行mutate(除法)操作计算分组相对频率?
解决方案
方法1:单步分组汇总(最推荐)
不用分开统计总人数和选答案2的人数,直接在同一个分组汇总逻辑里计算,自动保留所有分组,不会出现行数不匹配问题:
library(dplyr) rel <- DF %>% group_by(Group) %>% summarise( n = sum(Question == 2), # 统计当前组选答案2的人数,无符合记录则返回0 total = n(), # 统计当前组总人数 rel_freq = n / total ) %>% select(Group, n, rel_freq)
运行结果:
# A tibble: 4 × 3 Group n rel_freq <dbl> <int> <dbl> 1 1 2 0.5 2 2 2 0.667 3 3 1 0.5 4 4 0 0
方法2:补全缺失分组(适配原有思路)
如果要保留你先统计总人数、再统计选2人数的逻辑,可以用complete函数补全筛选后缺失的分组行,再通过left_join按分组关联总人数表,避免按位置匹配的错误:
library(dplyr) library(tidyr) # 统计每个组总人数 ind_p_gr <- DF %>% group_by(Group) %>% summarise(total = n()) rel <- DF %>% count(Group, Question) %>% # 补全所有Group和Question的组合,缺失的计数填充为0 complete(Group, Question, fill = list(n = 0)) %>% filter(Question == 2) %>% # 通过Group列关联总人数表,避免直接按位置匹配的隐患 left_join(ind_p_gr, by = "Group") %>% mutate(rel_freq = n / total) %>% select(Group, n, rel_freq)
运行结果和方法1完全一致。
错误原因说明
你之前的报错核心是两个问题:
- 筛选
Question == 2后丢失了没有选2的分组4,导致结果只有3行,和4行的总人数表长度不匹配 - 直接提取Count列按位置做除法,即使长度匹配,一旦两个表的分组顺序不一致,会得到完全错误的结果,通过Group列关联是更稳妥的做法。
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

