双因子分组后计算组内类别占比的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
相关产品推荐
相关产品推荐

