1

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

如果我能找到将其更改"-""* "但保留数字数据类型的可能性,那么第一次尝试将起作用。

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

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

谢谢

4

2 回答 2

1

您可以尝试使用“formattable”包。

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 控制台中突出显示表格并且仍然使用表格值本身,那么我的解决方案不是很好。您不能简单地将您的第一个解决方案用于视觉效果,但保留原始表格的副本以用于您想用它做的任何其他事情吗?

于 2016-06-02T21:46:13.647 回答
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代码中,而不是相互依赖。这主要源于历史的兼容性,类似的原因应该在未来改变。

于 2016-06-04T19:30:16.700 回答