如何在R语言中制作双分类列频数表并优化分组显示?
嗨,我来帮你解决这两个关于R语言分类变量频数表的问题!
一、制作包含两个分类列的频数表
这里有几个实用的方法,你可以根据自己的需求来选:
1. 基础R的table()函数
这是最直接的方式,适合快速查看交叉频数:
# 生成频数矩阵 freq_matrix <- table(df$MIPS_Group, df$WES_Cohort) # 转成数据框格式(方便后续处理) freq_df <- as.data.frame.matrix(freq_matrix)
它会返回一个矩阵,行对应MIPS_Group的所有唯一值,列对应WES_Cohort的唯一值,单元格就是两个分类组合的频数。
2. dplyr的count()方法(你当前在用的)
这种方式灵活性很高,能直接生成带频数的数据框,还能轻松添加百分比:
library(dplyr) long_freq_df <- df %>% count(MIPS_Group, WES_Cohort, name = "Frequency") %>% # 自定义频数列的名字 arrange(desc(Frequency)) %>% # 按频数降序排列 mutate(Overall_Percentage = Frequency / sum(Frequency)) # 计算整体占比
得到的是长格式表格,每个MIPS_Group和WES_Cohort的组合单独占一行。
3. janitor包的tabyl()(强烈推荐!)
这个包专门用来做整洁的统计表格,能一键生成带行/列总计和百分比的交叉表:
library(janitor) # 生成基础交叉频数表 clean_freq_table <- tabyl(df, MIPS_Group, WES_Cohort) # 美化表格:添加百分比、总计,同时显示频数和百分比 clean_freq_table <- clean_freq_table %>% adorn_percentages("row") %>% # 按行计算百分比,可选"col"(列占比)或"all"(整体占比) adorn_pct_formatting(digits = 1) %>% # 百分比保留1位小数 adorn_totals(c("row", "col")) %>% # 添加行和列的总计行/列 adorn_ns(position = "front") # 把频数放在百分比前面,格式比如"10 (25.0%)"
输出的表格非常直观,直接就能用来写报告。
二、优化成
MIPS_Group唯一值仅出现一次的格式 你现在的代码生成的是长格式,每个分类组合都会重复MIPS_Group的值。要实现每个MIPS_Group只出现一次,我们需要把表格转成宽格式,用tidyr包的pivot_wider()就能轻松做到:
方法1:转成宽格式(统计结果清晰展示)
library(tidyr) # 先计算好长格式的统计数据 long_stats <- df %>% count(MIPS_Group, WES_Cohort, name = "Frequency") %>% arrange(desc(Frequency)) %>% mutate(Overall_Percentage = Frequency / sum(Frequency)) # 转换为宽格式 wide_stats <- long_stats %>% pivot_wider( id_cols = MIPS_Group, # 用这个列作为行的唯一标识 names_from = WES_Cohort, # 把这个分类变量的每个水平转成列 values_from = c(Frequency, Overall_Percentage), # 要填充到列里的数值 names_sep = "_" # 列名的分隔符,比如"CohortA_Frequency" )
这样每个MIPS_Group会单独占一行,列则是每个WES_Cohort对应的频数和百分比,完全符合你要的“唯一值仅出现一次”的要求。
方法2:输出时合并单元格(适合可视化报告)
如果你希望在输出表格(比如HTML或PDF)时,让相同的MIPS_Group单元格合并显示,看起来更整洁,可以用kableExtra包来美化:
library(kableExtra) wide_stats %>% kbl(caption = "MIPS分组与WES队列的频数统计") %>% # 添加表格标题 kable_styling(bootstrap_options = "striped", full_width = FALSE) %>% collapse_rows(columns = 1, valign = "middle") # 合并第一列相同值的单元格
这样第一列的MIPS_Group唯一值只会显示一次,表格的可读性更强。
内容的提问来源于stack exchange,提问作者Carmen Sandoval
相关产品推荐
相关产品推荐

