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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:06:00