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

如何在R语言中生成多列带行百分比的频数表?

在R中生成含行百分比的FCI项频数表

解决方案思路

我们需要针对每个FCI项,分别计算「否(0)」「是(1)」的行百分比(即该项内的占比),以及NA的数量。可以通过数据格式转换+分组统计实现,避开table1包默认的分组逻辑干扰。

示例数据

先构造与需求匹配的模拟数据框:

# 加载所需工具包
library(dplyr)
library(tidyr)

# 示例数据结构
df <- data.frame(
  subject_id = 1:10,
  FCI1 = c(0,1,0,1,NA,0,1,NA,0,1),
  FCI2 = c(1,0,NA,1,0,1,NA,0,1,0),
  FCI3 = c(NA,NA,0,0,1,1,0,1,NA,NA)
)

代码实现

# 1. 提取FCI列并转为长格式,方便按项统计
long_df <- df %>%
  select(starts_with("FCI")) %>%
  pivot_longer(cols = everything(), names_to = "FCI项", values_to = "响应")

# 2. 分组计算各项统计量
result_table <- long_df %>%
  group_by(`FCI项`) %>%
  summarise(
    总样本数 = n(),
    否_数量 = sum(响应 == 0, na.rm = TRUE),
    是_数量 = sum(响应 == 1, na.rm = TRUE),
    NA_数量 = sum(is.na(响应)),
    # 计算行百分比(以非NA样本为分母),保留1位小数
    否(%) = ifelse((总样本数 - NA_数量) == 0, NA, round((否_数量 / (总样本数 - NA_数量)) * 100, 1)),
    是(%) = ifelse((总样本数 - NA_数量) == 0, NA, round((是_数量 / (总样本数 - NA_数量)) * 100, 1))
  ) %>%
  # 调整列顺序并重命名NA列
  select(`FCI项`, `否(%)`, `是(%)`, NA_数量) %>%
  rename(NA = NA_数量)

# 查看最终表格
print(result_table)

输出结果示例

# A tibble: 3 × 4
  `FCI项` `否(%)` `是(%)`    NA
  <chr>     <dbl>   <dbl> <int>
1 FCI1        50      50      2
2 FCI2        40      60      2
3 FCI3        40      60      4

关键说明

  • 为什么不用table1?table1包的核心是按分组变量拆分后统计变量分布,但你的需求是按每个FCI变量自身统计分布,直接用dplyr分组统计更贴合需求。
  • 行百分比逻辑:以「该项非NA样本数」为分母,确保百分比是该项内的占比,符合统计要求。
  • 异常处理:如果某个FCI项全为NA,会自动将百分比设为NA,避免除以0的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02