2016-06-02 20 views
1

Ich versuche, den maximalen Wert jeder Spalte in einer Kreuztabelle in R.Wie wird der Höchstwert jeder Spalte in einer Kontingenztabelle hervorgehoben?

Was ich versuchte, so weit

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 

Der erste Versuch hervorzuheben funktionieren würde, wenn ich eine Möglichkeit gefunden Ändern Sie die "-" zu "* ", aber behalten Sie den numerischen Datentyp bei.

Der zweite Versuch würde funktionieren, wenn ich eine Möglichkeit finden könnte, die Werte (die jetzt Zeichenketten sind) mit den Spaltennamen auszurichten.

Meine Frage
Können Sie mir eine Lösung geben, arbeiten zumindest einer dieser Versuche zu machen - oder eine ganz andere Lösung, mit der ich den maximalen Wert jeder Spalte in einer Kreuztabelle hervorheben?

Vielen Dank

Antwort

0

Die Lösung ist relativ unerwartet aufgrund einige Inkonsistenzen zwischen verschiedenen Druckmethoden in 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 

Die Dokumentation auf print.matrix sagt:

print.matrix und print.default beide Druck Matrices und weisen jeweils zumin mindestens ein optionales Argument, das dem anderen fehlt. Auch, beide direkt Versand in .Internal Code direkt anstelle von je auf anderen. Dies ist hauptsächlich auf historische Kompatibilität zurückzuführen und ähnliche Gründe sollten in Zukunft geändert werden.

1

Sie könnten das Paket 'formatiert' versuchen.

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

Ergebnis:

enter image description here

Nachteil ist, dass es nur exportierbare als Bild oder HTML-Widget, nicht eine tatsächliche Tabelle (obwohl die Tabelle als solche innerhalb R verwendbar bleibt).

Dies ist vielleicht nicht das, was Sie suchen, aber ich weiß nicht, was Ihr Ziel ist. Wenn Sie die Tabelle in der R-Konsole einfach hervorheben möchten und die Tabellenwerte dennoch selbst verwenden möchten, ist meine Lösung nicht sehr gut. Könnten Sie nicht einfach Ihre erste Lösung für das Visual verwenden, sondern eine Kopie der Originaltabelle für andere Dinge, die Sie damit machen wollen?