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

如何为三维加权交叉频数表添加完整的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:55:00