我试图突出显示R中列联表中每列的最大值。
到目前为止我尝试了什么
tbl <- as.matrix(table(c(iris[5], data.frame(Petal.Width = cut(iris$Petal.Width, 3)))))
pos <- cbind(apply(tbl, 2, which.max), 1:dim(tbl)[2])
tbl <- addmargins(tbl)
# First attempt
tbl2 <- tbl
tbl2[pos] <- -tbl2[pos]
tbl2
## Petal.Width
## Species (0.0976,0.9] (0.9,1.7] (1.7,2.5] Sum
## setosa -50 0 0 50
## versicolor 0 -49 1 50
## virginica 0 5 -45 50
## Sum 50 54 46 150
# Second attempt
tbl2 <- tbl
tbl[pos] <- paste("*", tbl[pos])
print(tbl, justify = "right")
## Petal.Width
## Species (0.0976,0.9] (0.9,1.7] (1.7,2.5] Sum
## setosa * 50 0 0 50
## versicolor 0 * 49 1 50
## virginica 0 5 * 45 50
## Sum 50 54 46 150
如果我可以找到将"-"
更改为"* "
但保留数字数据类型的可能性,则第一次尝试会有效。
如果我能找到将值(现在是字符串)与列名对齐的可能性,那么第二次尝试就会起作用。
我的问题
你能给我一个解决方案,让这些尝试中至少有一个起作用 - 或者是一个完全不同的解决方案,我可以突出显示列联表中每列的最大值吗?
谢谢
答案 0 :(得分:1)
您可以尝试使用&#39; formattable&#39;。
install.packages("formattable")
library(formattable)
tbl_df <- as.data.frame.matrix(tbl)
tbl_df_sub <- tbl_df[1:3,]
t <- formattable(tbl_df_sub, list(
'(0.0976,0.9]'=color_tile("white", "green"),
'(0.9,1.7]'=color_tile("white", "green"),
'(1.7,2.5]'=color_tile("white", "green")
))
结果:
缺点是它只能作为图像或html小部件导出,而不是实际的表格(尽管该表在R中仍可使用)。
这可能不是您想要的,但我不知道您的目标是什么。如果您只想在R控制台中突出显示该表并仍然使用表值本身,我的解决方案并不是很好。你不能简单地使用你的第一个视觉解决方案,但保留原始表的副本以用于你想用它做的任何其他事情吗?
答案 1 :(得分:0)
由于R:
中不同打印方法之间存在一些不一致,解决方案相对出乎意料tbl2 <- tbl
tbl[pos] <- paste("*", tbl[pos])
print(tbl, quote = FALSE, right = TRUE)
## Petal.Width
## Species (0.0976,0.7] (0.7,1.3] (1.3,1.9] (1.9,2.5] Sum
## setosa * 50 0 0 0 50
## versicolor 0 * 28 * 22 0 50
## virginica 0 0 21 * 29 50
## Sum 50 28 43 29 150
print.matrix
上的文档说:
print.matrix
和print.default
都是打印矩阵,每个都有 至少是另一个缺乏的可选参数。还有,都是直接的 直接发送到.Internal
代码而不是依赖于每个代码 其他。这主要源于历史兼容性和类似性 原因应该在将来改变。