2012-07-31 7 views
9

Ich habe Diagonalmatrizen mit NAs und Nullen, die ich verstecken möchte.So unterdrücken Sie den Nulldruck in einer Tabelle (zero.print = "" funktioniert nicht)

na.print = "" funktioniert einwandfrei, aber zero.print = "." scheint 0,00 als! = 0 zu behandeln?

Hier ist ein lauffähiges Beispiel mit Druck, so können Sie sehen, was ich meine: (! Danke Jungs)

x <- matrix(c(0.01, NA, NA, NA, 0.00, 0.00, NA, NA, 0.00, 0.00, -0.01, NA, 0.00, 0.00, 0.00, 0.00), nrow=4, byrow=TRUE) 
x 
     [,1] [,2] [,3] [,4] 
    [1,] 0.01 NA NA NA 
    [2,] 0.00 0 NA NA 
    [3,] 0.00 0 -0.01 NA 
    [4,] 0.00 0 0.00 0 

print.table(x, na.print="", zero.print=".") 
     [,1] [,2] [,3] [,4] 
    [1,] 0.01     
    [2,] 0.00 0.00    
    [3,] 0.00 0.00 -0.01  
    [4,] 0.00 0.00 0.00 0.00 

die hilfreichen Antworten unten Nach und in print.table auf die explizite Wahl basierend auf nicht Null .print-Elemente, bei denen ein Element in der Tabelle fehlschlägt (x == round (x)), hier ist eine Version, die mit floating.point funktioniert. Ich habe es für eine Datendruck-Aufgabe geschrieben, aber es funktioniert mit Matrizen. Hier

print.dataframe <- function (x, digits = getOption("digits"), quote = FALSE, na.print = "", zero.print = "0", justify = "none", ...){ 
    xx <- format(x, digits = digits, justify = justify) 
    if (any(ina <- is.na(x))) 
     xx[ina] <- na.print 
    i0 <- !ina & x == 0 
    if (zero.print != "0" && any(i0)) 
     xx[i0] <- zero.print 
    if (is.numeric(x) || is.complex(x)){ 
     print(xx, quote = quote, right = TRUE, ...) 
    }else{ 
     print(xx, quote = quote, ...) 
    } 
    invisible(x) 
} 

print.dataframe(bob, zero.print = ".", justify="left") 
+0

Da 'table' Objekte implizit davon ausgehen, dass alle Elemente Integer sind, funktioniert' print.table' nicht für Ihre Daten. – Andrie

Antwort

3

ist eine Abhilfe:

> print.table(local({x[x==0] <- NA; x})) 
    [,1] [,2] [,3] [,4] 
[1,] 0.01     
[2,]      
[3,]   -0.01  
[4,]      

Im Fall, dass Sie anderen Ausdruck für NA und Null benötigen, dann,

> print(ifelse(is.na(x), "", ifelse(x == 0, ".", x)), quote = FALSE) 
    [,1] [,2] [,3] [,4] 
[1,] 0.01     
[2,] . .    
[3,] . . -0.01  
[4,] . . .  . 
+0

Danke KOHSKE. Sieht so aus, als wäre es ein Fehler. PS: Das war meine Abhilfe, aber ich hätte lieber "." als leer .. ;-( – tim

+0

Dann finden Sie die aktualisierte oben. – kohske

+1

@tim Dies ist definitiv kein Fehler. Sie verwenden die Methode für 'print.table', um eine Matrix zu drucken - dies kann zu unerwarteten Ergebnissen führen. – Andrie

3

Per Andrie Eingangs- und Vorschlag ist dies kein Fehler im Code mit print.table. Es ist ein Problem mit der Bereitstellung einer Matrix print.table, die eine table erwartet. Wie Andrie betont, sind alle Wetten mit der erwarteten Leistung aus. Wenn Sie eine weitere Codezeile zu print.table (siehe unten) hinzufügen, wird es für Sie arbeiten (beachten Sie, dass ich diese PrintMatrix aufgerufen habe).

printmatrix <- 
function (x, digits = getOption("digits"), quote = FALSE, na.print = "", 
    zero.print = "0", justify = "none", ...) 
{ 
    xx <- format(unclass(x), digits = digits, justify = justify) 
    if (any(ina <- is.na(x))) 
     xx[ina] <- na.print 
    if (zero.print != "0" && any(i0 <- !ina & x == 0) && all(x == 
     round(x))) 
     xx[i0] <- sub("0", zero.print, xx[i0]) 
    xx[x == 0] <- zero.print       #the line I added 
    if (is.numeric(x) || is.complex(x)) 
     print(xx, quote = quote, right = TRUE, ...) 
    else print(xx, quote = quote, ...) 
    invisible(x) 
} 

printmatrix(x, zero.print = ".") 
+0

Ich sehe Andries Kommentare oben so ist kein Bug. –

+0

Ich bin mir ziemlich sicher, dass es kein Fehler ist. Sie versuchen, eine 'Matrix' mit der Methode für eine' Tabelle' zu ​​drucken - Alle Ergebnisse, die Sie erhalten, werden unerwartet sein. Ich schlage vor, dass Sie Ihre Antwort ändern. – Andrie

+0

@ Tyler Rinker Danke Tyler: Mit "&& all (x == round (x)))", sie sind explizit nicht Nullen Neuformatierung, es sei denn alle Werte sind ganze Zahlen Teil ... Ich sehe nicht den Zweck: Arbeiten Mit Floats, aber die Funktionalität zu deaktivieren, um Nullen auf eine visuell hilfreiche Weise genau anzuzeigen, wenn es am nützlichsten ist (in einem Feld von Dezimalwerten) – tim