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

R Markdown用datasummary生成含因子数值变量表格导出PDF问题

问题1:PDF编织报错siunitx相关问题

原因

datasummary生成LaTeX格式表格时默认启用siunitx包做数值列自动对齐,你的N (%)列包含字母、括号、百分号等非数值字符,siunitx将该列识别为数值列解析失败,触发报错。

解决方法

在datasummary函数中添加参数siunitx = FALSE关闭自动数值对齐即可,代码示例:

datasummary(..., siunitx = FALSE)

问题2:因子行重复显示图表问题

原因

kableExtra的spec_boxplot()、spec_hist()函数传入的列表长度和表格行数不匹配时,会自动循环填充列表内容,导致因子行复用了数值变量的图表。

解决方法

构造和表格行数完全匹配的图表输入列表,因子行对应位置设为NULL即可留空。比如你的表格共4行(mpg、class、region、hp),图表列表构造为:

plot_list = list(tmp_scaled$mpg, NULL, NULL, tmp_scaled$hp)
datasummary(...) %>%
  column_spec(column = 6, image = spec_boxplot(plot_list)) %>%
  column_spec(column = 7, image = spec_hist(plot_list))

问题3:新增Category列展示因子层级

直接使用datasummary的嵌套语法即可自动生成层级列,公式左侧调整为变量和自身层级嵌套的写法:

datasummary(mpg + class * Levels + region * Levels + hp ~ N_alt + Mean + SD + emptycol + emptycol, data = tmp)

输出会自动将因子的各个层级展示在第二列,数值变量的层级列留空,完全符合你期望的表格结构。

补充问题:自定义N_alt函数失效原因

失效有两个核心原因:

  1. 你在调整后的代码中加入了两行错误赋值:tmp$class <- 0、tmp$region <- 0,直接覆盖了之前生成的多分类因子值,所有因子都变成了单一值0,自然计算不出正确的频数。
  2. 函数逻辑错误:N_alt接收的参数x是对应变量的整列向量,x %in% c(tmp$class)是逐元素判断值是否匹配,而非判断变量类型,所有数值为0的行都会错误命中因子分支。正确的函数写法应该先判断变量类型:
N_alt <- function(x) {
  if (is.factor(x)) {
    freq <- table(x)
    pct <- round(prop.table(freq)*100, 1)
    paste0(freq, " (", pct, ")", collapse = "; ")
  } else {
    paste0(length(na.omit(x)), " (100.0)")
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:54:02