如何在R中创建适合发表的表格及相关问题解决
食物摄入统计表格常见问题解决方案
1. 修复arrange函数按“Yes”列排序无效的问题
排序失效通常有三类原因,对应修复方法如下:
- 列类型为字符型:将“Yes”列转换为数值型后再排序
# 转换类型并按Yes降序排序 df <- df %>% mutate(Yes = as.numeric(Yes)) %>% arrange(desc(Yes)) - 分组后未取消分组:若之前用
group_by()做过统计,需先执行ungroup()再排序df <- df %>% group_by(Food_Type) %>% summarise(Yes = sum(Response == 1)) %>% ungroup() %>% # 必须取消分组 arrange(desc(Yes)) - 列名含空格/特殊字符:用反引号包裹列名
df <- df %>% arrange(desc(`Yes (1)`))
2. 确保行百分比计算准确
行百分比的核心是明确分母范围(是否包含缺失值),按需求选择计算逻辑:
- 包含缺失值的行百分比:分母为该行所有样本数(Yes+No+缺失值)
df <- df %>% mutate( Total = Yes + No + Missing, Yes_Pct = (Yes / Total) * 100, No_Pct = (No / Total) * 100, Missing_Pct = (Missing / Total) * 100 ) - 排除缺失值的行百分比:分母为有效回答数(Yes+No),需处理分母为0的情况
df <- df %>% mutate( Valid_Total = Yes + No, Yes_Pct = ifelse(Valid_Total > 0, (Yes / Valid_Total) * 100, NA), No_Pct = ifelse(Valid_Total > 0, (No / Valid_Total) * 100, NA) ) - 加权样本场景:使用
weighted.mean()计算加权百分比df <- df %>% mutate(Yes_Pct = weighted.mean(Yes, weights = Sample_Weight) * 100)
3. 优化表格为适合发表的样式
推荐使用gt或kableExtra包生成专业发表级表格,以下是两种常用方案:
方案1:使用gt包(支持HTML/PDF输出)
library(gt) df %>% gt() %>% tab_header(title = "受访者过去24小时食物摄入情况统计") %>% tab_spanner(label = "人数分布", columns = c(Yes, No, Missing)) %>% tab_spanner(label = "占比(%)", columns = c(Yes_Pct, No_Pct, Missing_Pct)) %>% fmt_number(columns = ends_with("_Pct"), decimals = 1) %>% tab_options(table.width = pct(80))
方案2:使用kableExtra包(适合LaTeX/PDF输出)
library(kableExtra) df %>% select(Food, Yes, No, Missing, Yes_Pct, No_Pct) %>% kable( "latex", booktabs = TRUE, caption = "受访者过去24小时食物摄入情况统计", digits = 1 ) %>% kable_styling( latex_options = c("hold_position", "striped"), full_width = FALSE ) %>% add_header_above(c("食物类别" = 1, "人数" = 3, "占比(%)" = 2))
4. Rmarkdown输出PDF时去除每行开头的##
出现##通常是因为直接用print()输出内容,解决方法如下:
- 使用专业表格包输出:
gt、kableExtra等包会自动生成无##的整洁表格,只需在代码块设置echo=FALSE隐藏代码 - 输出纯文本内容:用
cat()替代print(),并设置代码块参数results='asis'```{r, echo=FALSE, results='asis'} cat("### 食物摄入统计结果\n") cat(paste("水果摄入Yes人数:", df$Yes[df$Food=="水果"], "\n")) - 禁用代码块的注释输出:如果是代码输出的注释,可在代码块设置
comment=""```{r, comment=""} head(df)
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

