如何为三维加权交叉频数表添加完整的measure_abbr边际频数?
解决方案
要计算每个facility_name*type分组下各measure_abbr的加权占比(即你所说的边际频数),问题出在你定义的marg函数仅处理了向量的第一个元素,我们需要对每个分组内的所有measure_abbr逐一计算占比。以下是两种可行的实现方式:
方法一:基于数组直接操作xtabs结果
xtabs生成的是三维数组(维度为facility_name × type × measure_abbr),我们可以用apply函数对前两个维度的每个组合,计算对应measure_abbr向量中每个元素占组内总和的百分比:
library(stats) library(dplyr) data("cms_patient_care", package = "tidyr") weights <- rnorm(252, 1, 0.1) df <- cbind(cms_patient_care, weights) crosstabs <- xtabs(weights ~ facility_name + type + measure_abbr, data=df) # 定义计算组内占比的函数 calc_pct <- function(x) { x / sum(x) * 100 } # 对每个facility_name*type组合应用占比计算 crosstabs_pct <- apply(crosstabs-Se【示例 arrang�中iusarr(j torch观察简介?不对,直接写: crosstabs_pct <- apply(crosstabs, margin = c(1, 2), FUN = calc_pct) # 调整数组维度,恢复原结构(apply会自动转置维度) crosstabs_pct <- aperm(crosstabs_pct, c(2, 3, 1))
此时crosstabs_pct中的每个值,就是对应facility_name*type分组下,该measure_abbr的加权占比百分比。
方法二:基于dplyr数据框处理(更直观)
如果觉得数组操作容易混淆维度,可以用dplyr分组计算,再整理成交叉表形式:
library(dplyr) library(tidyr) data("cms_patient_care", package = "tidyr") weights <- rnorm(252, 1, 0.1) df <- cbind(cms_patient_care, weights) %>% as_tibble() %>% group_by(facility_name, type) %>% mutate( group_total = sum(weights), measure_pct = weights / group_total * 100 ) %>% ungroup() # 可选:整理成交叉表格式 cross_tab_pct <- df %>% pivot_wider( names_from = measure_abbr, values_from = measure_pct, values_fill = 0 # 缺失值填充为0 )
这种方式更灵活,既能直接查看每个分组的占比明细,也能通过pivot_wider转成类似xtabs的交叉表结构。
原代码仅返回第一个元素的原因
你定义的marg <- function(x) {x[1]/sum(x)*100}仅提取了每个分组向量的第一个元素计算占比,自然只能得到第一个measure_abbr的结果。修改函数为返回每个元素的占比后,就能覆盖所有measure_abbr了。
内容的提问来源于stack exchange,提问作者axel
相关产品推荐
相关产品推荐

