将expss表格转为huxtable后出现空单元格问题求助
expss转huxtable后Valid N列空值问题排查
问题描述
制作报告时偏好expss的表格格式,但因huxtable能在R Markdown中实现表格样式自定义与自动添加标题,选择将expss表格转为huxtable格式。但转换后出现异常:原expss表格中Valid N列有数值,转为huxtable后该列单元格全部为空。
重现代码
expss表格生成代码
tab4 = m1 %>% tab_cells(age, num_year, years) %>% tab_cols(sex) %>% tab_stat_fun(Mean = w_mean, Median =w_median, "Std. dev." = w_sd, "Valid N" = w_n ,method = list) %>% tab_pivot() |> tab_caption("Summary statistics") tab4
huxtable格式转换代码
as_hux(tab4) |> set_bottom_border(col = c(2,3,4,5,6,7,8,9), row = everywhere) |> set_bold(col = 1, row=everywhere) |> set_bold(col = c(2,3,4,5,6,7,8,9), row = c(1,2,3)) |> set_row_height(c(.2, .2, .2)) |> set_align(col = c(2,3,4,5,6,7,8,9), row = everywhere, value = "centre")
测试数据集(前20行)
structure(list(age = structure(c(32, 45, 53, 41, 68, 41, 42, 52, 52, 35, 37, 64, 54, 54, 38, 56, 33, 41, 34, 68), label = "Age (in years)", class = c("labelled", "numeric")), years = structure(c(3, 16, 20, 17, 20, 12, 11, 15, 20, 6, 1, 32, 4, 7, 12, 33, 12, 12, 10, 40), label = "Experience in field (in years)", class = c("labelled", "numeric")), num_year = structure(c(3, 20, 27, 17, 40, 12, 6, 9, 20, 8, 11, 32, 8, 20, 12, 33, 12, 4, 10, 40), label = "Experience with current office (in years)", class = c("labelled", "numeric"))), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))
可能原因及解决建议
1. 特殊类型未被正确解析
expss生成的Valid N列可能是labelled类型,huxtable的as_hux()函数对该类型的数值解析存在问题,导致显示为空。
- 解决:转换前先将Valid N列转为普通数值:
tab4 = m1 %>% tab_cells(age, num_year, years) %>% tab_cols(sex) %>% tab_stat_fun(Mean = w_mean, Median =w_median, "Std. dev." = w_sd, "Valid N" = w_n ,method = list) %>% tab_pivot() |> mutate(across(contains("Valid N"), as.numeric)) |> # 新增转换步骤 tab_caption("Summary statistics")
2. method = list导致结构不兼容
tab_stat_fun中使用method = list会改变统计结果的存储结构,huxtable转换时无法识别该结构下的数值。
- 解决:移除
method = list参数,使用默认设置生成表格后再转换。
3. 格式设置代码干扰
先跳过所有格式设置,直接输出as_hux(tab4),检查Valid N列是否有值,排除是格式设置中列索引错误导致的数值隐藏。
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

