2012-07-31 16 views
9

Tengo matrices diagonales con NA y ceros que quiero ocultar.Cómo suprimir la impresión cero en una tabla (zero.print = "" no funciona)

na.print = "" funciona bien, pero zero.print = "." parece tratar 0.00 como! = 0?

Aquí está un ejemplo ejecutable con la impresión a cabo para que pueda ver lo que quiero decir: (gracias chicos)

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 

Siguiendo las respuestas útiles a continuación, y en base a la elección explícita en print.table que no es cero .print elementos donde cualquier elemento en la tabla falla (x == round (x)), aquí hay una versión que funciona con floating.point. Lo escribí para una tarea de impresión de marco de datos, pero funciona con matrices.

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

Dado que los objetos 'table' asumen implícitamente que todos los elementos son enteros,' print.table' no funcionará para sus datos. – Andrie

Respuesta

3

Aquí es una solución:

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

En el caso de que usted necesita diversa expresión de NA y cero, entonces,

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

Gracias kohske. Parece que es un error entonces. PD: Esa fue mi solución, pero prefiero tener "." que en blanco ... ;-( – tim

+0

Luego encuentre la actualización anterior. – kohske

+1

@tim Definitivamente no es un error. Está utilizando el método para 'print.table' para imprimir una matriz, esto puede arrojar resultados inesperados. – Andrie

3

entrada y la sugerencia de Per Andrie esto no es una error en el código con print.table. Es un problema con el suministro de una matriz a print.table que espera un table. Como Andrie señala que todas las apuestas están apagadas con el resultado esperado. Si agrega una línea de código adicional al print.table (ver a continuación), funcionará para usted (note que llamé a esta impresora).

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

Veo los comentarios de Andrie arriba, así que no es un error. –

+0

Estoy bastante seguro de que no es un error. Estás tratando de imprimir una 'matriz' usando el método para una' tabla' - cualquier resultado que obtenga será inesperado. Te sugiero que modifiques tu respuesta. – Andrie

+0

@Tyler Rinker Gracias Tyler: Con "&& all (x == round (x)))", explícitamente no vuelven a formatear ceros a menos que todos los valores sean porciones de enteros ... No veo el propósito de eso: Trabajar con flotantes, pero deshabilitando la funcionalidad para ver ceros de una manera visualmente útil exactamente cuando es más útil (en un campo de valores decimales) – tim

Cuestiones relacionadas