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

双因子分组后计算组内类别占比的R语言高效实现问询

问题描述

已通过group_by(x, y)对数据集分组,统计了每个分组内var各类别的观测数,代码及结果如下:

# 修正原始数据的向量长度不一致问题,字符需加引号
df1 <- data.frame(
  x = c("a","a","b","a","b","c","a","c","a","b"),
  y = c(0,1,0,1,1,0,1,0,0,0),
  var = c("inf", "med", "inf", "sup", "med", "med", "sup", "inf", "med", "sup")
)

conta_var <- df1 %>% 
  group_by(x, y) %>% 
  count(var)

得到的结果:

# A tibble: 9 × 4
# Groups:   x, y [5]
  x         y var       n
  <chr> <dbl> <chr> <int>
1 a         0 inf       1
2 a         0 med       1
3 a         1 med       1
4 a         1 sup       2
5 b         0 inf       1
6 b         0 sup       1
7 b         1 med       1
8 c         0 inf       1
9 c         0 med       1

需要新增一列n_perc,计算每个n占对应x-y组合总观测数的百分比,希望找到高效实现方式,避免手动分组计算再嵌套判断。

解决方案

利用dplyr的分组上下文,直接在现有分组基础上计算百分比即可。当前数据已经按x, y分组,sum(n)会自动计算每个分组内的总观测数,直接用n / sum(n)就能得到占比:

# 方式1:在已统计的结果上新增列
conta_var <- conta_var %>% 
  mutate(n_perc = n / sum(n))

# 方式2:一步完成统计+百分比计算
conta_var <- df1 %>% 
  group_by(x, y) %>% 
  count(var) %>% 
  mutate(n_perc = n / sum(n))
结果展示

执行后得到的结果:

# A tibble: 9 × 5
# Groups:   x, y [5]
  x         y var       n n_perc
  <chr> <dbl> <chr> <int>  <dbl>
1 a         0 inf       1   0.5 
2 a         0 med       1   0.5 
3 a         1 med       1   0.333
4 a         1 sup       2   0.667
5 b         0 inf       1   0.5 
6 b         0 sup       1   0.5 
7 b         1 med       1   1   
8 c         0 inf       1   0.5 
9 c         0 med       1   0.5 

如果需要保留指定小数位数,可以用round()调整格式:

conta_var <- conta_var %>% 
  mutate(n_perc = round(n / sum(n), 2))

内容的提问来源于stack exchange,提问作者kinbeat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:20