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函数失效原因
失效有两个核心原因:
- 你在调整后的代码中加入了两行错误赋值:
tmp$class <- 0、tmp$region <- 0,直接覆盖了之前生成的多分类因子值,所有因子都变成了单一值0,自然计算不出正确的频数。 - 函数逻辑错误:
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
相关产品推荐
相关产品推荐

