如何突出列联表中每列的最大值?

时间:2016-06-02 19:22:28

标签: r printing highlight highlighting contingency

我试图突出显示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

如果我可以找到将"-"更改为"* "但保留数字数据类型的可能性,则第一次尝试会有效。

如果我能找到将值(现在是字符串)与列名对齐的可能性,那么第二次尝试就会起作用。

我的问题
你能给我一个解决方案,让这些尝试中至少有一个起作用 - 或者是一个完全不同的解决方案,我可以突出显示列联表中每列的最大值吗?

谢谢

2 个答案:

答案 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")
))

结果:

enter image description here

缺点是它只能作为图像或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.matrixprint.default都是打印矩阵,每个都有   至少是另一个缺乏的可选参数。还有,都是直接的   直接发送到.Internal代码而不是依赖于每个代码   其他。这主要源于历史兼容性和类似性   原因应该在将来改变。