R语言中如何将addmargins生成的列边际格式改为百分比?
把列联表的列边际从求和改为百分比的解决方案
嘿,我来帮你搞定这个问题!你已经用addmargins(sn.tab)给列联表加了边际,但想把每列的边际从求和数值改成百分比对吧?这里有几种实用的方法,根据你的具体需求选就行:
方法一:先转成列百分比表,再加100%边际行
如果你想让整个表的单元格都是该单元格占对应列总和的百分比,同时边际行显示每列的总占比(也就是100%),可以这么做:
# 先拿示例数据演示(你替换成自己的sn.tab就行) set.seed(123) sn.tab <- table( sample(c("组1", "组2"), 100, replace = TRUE), sample(c("类别X", "类别Y", "类别Z"), 100, replace = TRUE) ) # 第一步:把原始列联表转换成按列计算的百分比表 sn.tab_col_pct <- prop.table(sn.tab, margin = 2) * 100 # 第二步:给百分比表添加边际行,每行的边际值设为100(因为每列百分比总和是100) sn.tab_pct_with_margin <- addmargins(sn.tab_col_pct, margin = 1, FUN = function(x) 100) # 查看结果,保留1位小数更清晰 print(sn.tab_pct_with_margin, digits = 1)
方法二:保留原始频数,只把列边际改成占总样本的百分比
要是你想保留表格里的原始频数,只把最后一行的列边际(原本的求和值)改成该列总和占总样本的百分比,可以直接修改边际行的值:
# 先添加默认的求和边际表 sn.tab_with_margins <- addmargins(sn.tab) # 把最后一行的所有值转换成百分比(除以总样本数再乘100) total_samples <- sum(sn.tab) sn.tab_with_margins[nrow(sn.tab_with_margins), ] <- sn.tab_with_margins[nrow(sn.tab_with_margins), ] / total_samples * 100 # 查看结果 print(sn.tab_with_margins, digits = 1)
方法三:自定义addmargins的边际函数(灵活定制)
如果需要更个性化的百分比计算,比如让边际显示某类自定义占比,可以给addmargins()传入自定义函数:
# 自定义函数:计算某列总和占总样本的百分比 col_total_pct <- function(x) { # x是当前列的所有值,先算列总和,再除以总样本数转百分比 sum(x) / sum(sn.tab) * 100 } # 添加列边际行,用自定义函数计算百分比 sn.tab_custom_margin <- addmargins(sn.tab, margin = 1, FUN = col_total_pct) print(sn.tab_custom_margin, digits = 1)
这几种方法里,方法一和二最常用,你可以根据自己的展示需求来选~
内容的提问来源于stack exchange,提问作者Dustin Smith
相关产品推荐
相关产品推荐

