2

我正在尝试创建一个 data.frame,其中某些单元格缺少值。我想知道是否有任何方法可以隐藏 NA,而不是显示 NA?我想要的基本上就像一个方差分析表,如下所示。

 x = rnorm(40)    
 y = rep(1:2, each=20)    
 z = rep(c(1,2,1,2), each=10)  
 model1 = lm(x~y * z)  
 model2 = lm(x~y + z)  
 anova(model1, model2)  

 #Analysis of Variance Table
 #Model 1: x ~ y * z
 #Model 2: x ~ y + z
 #Res.Df    RSS Df Sum of Sq      F Pr(>F)
 #1     36 38.931                           
 #2     37 39.248 -1  -0.31705 0.2932 0.5915

输出如上。如果您尝试访问这些空白单元格,您将获得 NA

 anova(model1, model2)[1,4]
 #[1] NA

提前致谢!!

4

3 回答 3

6

print.anova通过使用 的na.print选项来工作print.default,如下所示:

> x <- matrix(c(101:111/100, NA), nrow=3)
> print(x, na.print="")
     [,1] [,2] [,3] [,4]
[1,] 1.01 1.04 1.07 1.10
[2,] 1.02 1.05 1.08 1.11
[3,] 1.03 1.06 1.09     

但是,这仅适用于矩阵,不适用于数据帧。

对于数据帧,将 NA 替换为 "" 的建议很好,但会丢失通常的数字打印;您可以format.data.frame在更换前使用。阅读该print.data.frame功能以获取更多详细信息。这样做,您也可以替换为 NA 然后使用na.print选项,如上。

> y <- as.data.frame(x)
> m <- as.matrix(format.data.frame(y, digits = NULL, na.encode = FALSE))
> m[is.na(y)] <- NA
> print(m, na.print="", quote=FALSE)
  V1   V2   V3   V4  
1 1.01 1.04 1.07 1.10
2 1.02 1.05 1.08 1.11
3 1.03 1.06 1.09   

看看第四列中的数字是如何排列的?与此相比。

> z <- y
> z[is.na(z)] <- ""
> print(z)
    V1   V2   V3   V4
1 1.01 1.04 1.07  1.1
2 1.02 1.05 1.08 1.11
3 1.03 1.06 1.09     
于 2012-05-08T01:18:38.607 回答
0

这个问题有点令人困惑。但是我认为您有一个带有 NA 的表,并且您不希望 NA 出现在您提供的 anova 表中?如果这是正确的,您可以索引以查找 NA 并替换为“”:

(w <- data.frame(anova(model1, model2))) #your example as a data frame with NAs
w[is.na(w)] <- ""                        #index to find NAs and replace with ""
w
于 2012-05-08T00:59:03.097 回答
0

Aaron 的答案(这是一个很好的答案)依赖于print.default- 我发现这不太理想,因为我需要使用row.names = FALSE,仅在print.data.table. (并且quote=FALSE是默认设置print.data.table,所以那里少了一件需要担心的事情。)

您不必将 data.table 转换为矩阵,您可以将其转换为字符列表并返回 data.frame,如下所示:

prettyPrintDf <- function(df, ...) # My function
  print(format.data.frame(data.frame(lapply(df, as.character)), na.encode = FALSE), 
        na.print="", ...)

所以给定一个像这样的data.frame

some_df <- data.frame(a = c(1,2,NA), b = c(4,NA,6), c = letters[1:3])

你可以做:

> prettyPrintDf(some_df, row.names=FALSE)
 a b c
 1 4 a
 2   b
   6 c
于 2016-07-01T20:44:25.280 回答