R中如何对addmargins生成的列联表使用formattable格式化?
嘿,恭喜你第一次提问呀!刚接触R遇到这种小问题太正常了,我来帮你捋捋~
你遇到的问题根源在于:addmargins()生成的my_table是table类对象,而formattable()的核心格式化逻辑是针对数据框(data frame)或 tibble 这类结构化数据设计的,直接传入table对象的话,它只会输出默认的表格样式,不会触发自定义格式化效果。
解决办法很简单,把table对象转换成数据框就行,下面是具体的步骤和代码示例:
首先,先模拟你的数据(方便你直接测试):
# 模拟你的原始数据框 my_df <- data.frame( gender = sample(c("m", "f"), 100, replace = TRUE), sick = sample(c("yes", "no"), 100, replace = TRUE) ) # 生成带边际和的列联表(和你的代码一致) my_table <- addmargins(table(my_df$gender, my_df$sick))
接下来把table转换成数据框,同时处理好行名(因为边际和的行/列名是"Sum",我们需要保留这个信息):
# 将table对象转为数据框,保留行名 my_table_df <- as.data.frame.matrix(my_table) # 把行名(gender的类别和Sum)转为单独的一列,让formattable更容易处理 my_table_df$gender <- rownames(my_table_df) # 调整列顺序,把gender列放在最前面(可选,但更直观) my_table_df <- my_table_df[, c("gender", "yes", "no", "Sum")]
现在就可以用formattable()来格式化了,比如给边际和的行/列加样式:
library(formattable) formattable(my_table_df, list( # 给Sum列添加浅灰色背景 Sum = formatter("span", style = ~ style("background-color", "#f0f0f0")), # 给gender列的"Sum"行加粗 gender = formatter("span", style = ~ ifelse(gender == "Sum", "font-weight: bold", "")) ) )
这样你就能看到预期的格式化效果啦!如果需要更复杂的样式,比如根据数值大小添加颜色渐变,都可以在list()里继续添加规则。
内容的提问来源于stack exchange,提问作者tholori
相关产品推荐
相关产品推荐

