如何合并含重复行名的R数据框并生成带IQR的汇总表?
解决方法
1. 数据整理与合并
别用rbind(),它是行方向合并,会导致重复行名被自动重命名。我们需要把两个数据框转成宽格式后按参数名合并,具体步骤如下:
先加载必要的包:
library(dplyr) library(tidyr) library(knitr)
处理两个数据框,把中位数和IQR格式化为指定字符串,并转换为宽格式:
# 处理df1,生成pass列的格式化内容 df1_processed <- df1 %>% rownames_to_column("param") %>% mutate(pass = paste0(median, " (", Q25, "-", Q75, ")")) %>% select(param, pass) # 处理df2,生成fail列的格式化内容 df2_processed <- df2 %>% rownames_to_column("param") %>% mutate(fail = paste0(median, " (", Q25, "-", Q75, ")")) %>% select(param, fail) # 按参数名合并两个处理后的表 final_df <- inner_join(df1_processed, df2_processed, by = "param") # 可选:把param设为行名 rownames(final_df) <- final_df$param final_df <- final_df %>% select(-param)
执行后final_df的结构完全符合需求:行是param1到param4,列是pass和fail,每个单元格为「中位数(IQR)」格式。
2. 用kable生成美观表格
用kable()可以直接把final_df转成格式化表格:
kable(final_df, caption = "参数汇总表(中位数(IQR))")
如果需要进一步美化,可结合kableExtra包:
library(kableExtra) kable(final_df, caption = "参数汇总表(中位数(IQR))") %>% kable_styling(bootstrap_options = c("striped", "hover"))
补充说明
rbind()不适用的原因:它是堆叠行,会让pass和fail的参数行重复出现,R为避免重复行名会自动加后缀(如param1.1),不符合「以参数为行、分组为列」的需求。- 格式化逻辑:
paste0()用于无分隔符拼接内容,把中位数、括号、Q25、Q75组合成指定格式。
内容的提问来源于stack exchange,提问作者BeardedWisdom
相关产品推荐
相关产品推荐

