如何在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
相关产品推荐
相关产品推荐

