如何为无列名的gt表格中的p值按阈值设置颜色编码?
解决gt表格无显示列名时的p值颜色编码问题
你的表格并非真的没有列名,只是通过cols_label(group1 = "")把第一列的显示标签设为空了,其他p值列的列名其实是"0"、"1"、"10"、"100"、"1000"。要实现p值颜色编码,只需正确选中这些列并处理数值类型即可,以下是两种可行方案:
方案一:使用data_color批量设置颜色
先将p值列转为数值类型,再根据阈值设置颜色:
library(dplyr) library(gt) library(tidyr) group1 <- c("0", "1", "10", "100", "1000") group2 <- c("0", "1", "10", "100", "1000") pvalue <- c("0.06", "0.042", "0.001", "1", "0.02") data <- data.frame(group1, group2, pvalue) data %>% pivot_wider(names_from = group2, values_from = pvalue) %>% mutate(across(-group1, as.numeric)) %>% # 将所有p值列转为数值类型 gt() %>% cols_label(group1 = "") %>% sub_missing(columns = everything(), rows = everything(), missing_text = "") %>% data_color( columns = -group1, # 选中除group1外的所有p值列 colors = scales::col_bin( palette = c("red", "blue", "black"), bins = c(-Inf, 0.01, 0.05, Inf), direction = 1 ) )
方案二:使用fmt结合cell_text自定义颜色逻辑
通过函数判断每个p值的阈值,灵活设置颜色:
library(dplyr) library(gt) library(tidyr) group1 <- c("0", "1", "10", "100", "1000") group2 <- c("0", "1", "10", "100", "1000") pvalue <- c("0.06", "0.042", "0.001", "1", "0.02") data <- data.frame(group1, group2, pvalue) data %>% pivot_wider(names_from = group2, values_from = pvalue) %>% gt() %>% cols_label(group1 = "") %>% sub_missing(columns = everything(), rows = everything(), missing_text = "") %>% fmt( columns = -group1, fns = function(x) { x_num <- as.numeric(x) color <- dplyr::case_when( x_num < 0.01 ~ "red", x_num < 0.05 ~ "blue", TRUE ~ "black" ) cell_text(color = color) } )
关键注意点:
- 原代码中
pvalue是字符类型,必须先转为数值才能进行大小比较,否则颜色逻辑无法生效。 - 选中p值列时,用
-group1即可排除第一列,无需手动输入所有列名,更灵活。
内容的提问来源于stack exchange,提问作者MM1
相关产品推荐
相关产品推荐

