【问题标题】:How to suppress zero printing in a table (zero.print="" not working)如何抑制表格中的零打印(zero.print="" 不起作用)
【发布时间】:2012-07-31 12:07:03
【问题描述】:

我想隐藏带有 NA 和零的对角矩阵。

na.print = "" 工作正常,但 zero.print = "."似乎将 0.00 视为 != 0 ?

这是一个带有打印输出的可运行示例,因此您可以了解我的意思:

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

按照下面的有用答案(谢谢大家!),并基于 print.table 中的明确选择,而不是 zero.print 表中任何项目失败的项目(x == round(x)),这是一个版本它适用于浮点数。我为数据框打印任务编写了它,但它适用于矩阵。

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

【问题讨论】:

  • 由于 table 对象隐式假定所有元素都是整数,因此 print.table 将不适用于您的数据。

标签: r pretty-print


【解决方案1】:

这里有一个解决方法:

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

如果你需要不同的 NA 和零表达式,那么,

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

【讨论】:

  • 感谢 kohske。看起来它是一个错误。 PS:这是我的解决方法,但我宁愿有“。”比空白.. ;-(
  • @tim 这绝对不是错误。您正在使用print.table 的方法打印矩阵 - 这可能会产生意想不到的结果。
  • 谢谢@Andrie:如果表只存储整数,那么也许应该将所有内容向下转换为整数。 x = as.table(matrix(seq(0,1,.1))) class(x) # table 尽管没有整数 print.table(x) 真的,我认为请求变成了零和 NA 处理设施被添加到打印通用,或数据框和矩阵处理子类中
【解决方案2】:

根据 Andrie 的意见和建议,这不是 print.table 代码中的错误。向print.table 提供矩阵时会出现问题,该矩阵需要table。正如安德烈指出的那样,所有的赌注都与预期的输出有关。如果您向print.table(见下文)添加额外的一行代码,它将为您工作(注意我称之为打印矩阵)。

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

【讨论】:

  • 我在上面看到了 Andrie 的 cmets,所以这不是错误。
  • 我很确定这不是错误。您正在尝试使用table 的方法打印matrix - 您得到的任何结果都会出乎意料。我建议你修改你的答案。
  • @Tyler Rinker 感谢 Tyler:使用“&& all(x == round(x)))”,除非所有值都是整数部分,否则它们不会明确重新格式化零……我不看到这样做的目的:使用浮点数,但在最有用的时候(在十进制值的字段中)禁用以视觉上有用的方式查看零的功能
  • @Tim Andrie 的观点是,如果它是一个传递给print.table 的表,它将全是整数。
猜你喜欢
  • 2018-05-27
  • 2010-09-24
  • 1970-01-01
  • 2021-11-22
  • 2016-03-18
  • 2014-03-24
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多