使用gt包opt_footnote_marks按p值标记列出现脚注匹配错误问题
问题根源
gt包的脚注标记分配逻辑是按照脚注在表格中首次出现的位置(从上到下、从左到右)排序分配opt_footnote_marks中设置的标记,和你调用tab_footnote的顺序无关。你之前单列场景下手动调整标记顺序的方案是适配单列的脚注出现顺序,多列时脚注出现顺序发生变化,自然就对应错乱了。
解决方案
直接给符合p值条件的单元格拼接标记,再统一声明脚注含义,完全规避顺序依赖问题,代码如下:
library("gt") library("data.table") # 生成测试数据 DT <- data.table(var1 = c(1:7), var1.p.value = c(0.7142599356, 0.0516123439, 0.0004532802, 0.1129728328, 0.3334458362, 0.3849460248, 0.0241492332), var2 = c(8:14), var2.p.value = c(0.0696197928, 0.0440874454, 0.1603414690, 0.0007604622, 0.2863551953, 0.1418785028, 0.3724698668)) # 初始化gt对象 gt.table <- gt(data = DT) # 循环处理需要加标记的列 for (col in c("var1", "var2")) { p_col <- paste0(col, ".p.value") gt.table <- gt.table %>% text_transform( locations = cells_body(columns = all_of(col)), fn = function(x) { p_vals <- DT[[p_col]] # 按优先级从高到低匹配标记 marks <- character(length(p_vals)) marks[p_vals < 0.1] <- "*" marks[p_vals < 0.05] <- "**" marks[p_vals < 0.01] <- "***" # 拼接数值和标记 paste0(x, marks) } ) } # 统一添加脚注说明 gt.table <- gt.table %>% # 可根据需求隐藏p值列 # cols_hide(columns = ends_with(".p.value")) %>% tab_footnote(footnote = "p<0.1", locations = NULL) %>% tab_footnote(footnote = "p<0.05", locations = NULL) %>% tab_footnote(footnote = "p<0.01", locations = NULL) %>% opt_footnote_marks(marks = c("*", "**", "***")) # 输出表格 gt.table
该方案完全不受脚注出现顺序影响,不管多少列、p值分布是什么样的,标记和区间的对应关系都不会错乱。
内容的提问来源于stack exchange,提问作者Ian Wang
相关产品推荐
相关产品推荐

