使用dplyr的group_by和reframe时观测计数异常的问题
问题原因解析
你的代码导致Rural/Urban计数翻倍的核心原因是数据重复复制:
- 第一步
mutate(Gender = "All") %>% bind_rows(., df)把原数据的每一行都复制了一遍——一份是修改Gender为"All"的版本,另一份是原数据版本。 - 原数据中的
Condition列(Rural/Urban)在这两份数据里完全一致,当你通过pivot_longer(c(Gender, Condition))把Gender和Condition转成subgroup时,每个原Condition值会在两份数据里各出现一次,最终导致统计时Condition类别的计数直接翻倍。
比如中国原有的1条Rural记录,在bind_rows后变成2条(原Gender=Female的行 + 修改后Gender=All的行),这两行的Condition都是Rural,所以转成subgroup后会生成2个Rural条目,最终统计n=2,是实际数量的两倍。
修正后的代码
不需要复制整个数据集,而是单独统计Gender=All的分组,再和原分组统计结果合并:
# 先统计原数据中Gender、Condition作为subgroup的计数 original_stats <- df %>% pivot_longer(c(Gender, Condition), values_to = "subgroup") %>% pivot_longer(c(var1, var2), names_to = "Variables", values_to = "Values") %>% group_by(Country, subgroup, Variables) %>% reframe(n = n()) # 单独统计Gender=All的情况 all_gender_stats <- df %>% pivot_longer(c(var1, var2), names_to = "Variables", values_to = "Values") %>% group_by(Country, Variables) %>% reframe(subgroup = "All", n = n()) # 合并结果并输出 bind_rows(original_stats, all_gender_stats) %>% arrange(Country, subgroup, Variables) %>% print(n = 50)
或者更简洁的写法,用group_modify一次性处理所有分组:
df %>% pivot_longer(c(var1, var2), names_to = "Variables", values_to = "Values") %>% group_by(Country, Variables) %>% group_modify(function(data, group_info) { # 统计Gender和Condition的分组计数 subgroup_counts <- data %>% pivot_longer(c(Gender, Condition), values_to = "subgroup") %>% count(subgroup, name = "n") # 添加Gender=All的计数 all_gender_count <- tibble(subgroup = "All", n = nrow(data)) bind_rows(subgroup_counts, all_gender_count) }) %>% ungroup() %>% arrange(Country, subgroup, Variables) %>% print(n = 50)
这两种写法都能得到正确的计数:中国Urban的n为5(对应var1和var2各5个观测),Rural的n为1,不会出现翻倍问题。
内容的提问来源于stack exchange,提问作者rez
相关产品推荐
相关产品推荐

