You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr的group_by和reframe时观测计数异常的问题

问题原因解析

你的代码导致Rural/Urban计数翻倍的核心原因是数据重复复制:

  1. 第一步mutate(Gender = "All") %>% bind_rows(., df)把原数据的每一行都复制了一遍——一份是修改Gender为"All"的版本,另一份是原数据版本。
  2. 原数据中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:23:21