是否可以不在数据框中显示NA?

时间:2012-05-08 00:50:48

标签: r dataframe na

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

 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

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

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

提前致谢!!

3 个答案:

答案 0 :(得分:6)

print.anova使用na.print的{​​{1}}选项,如下所示:

print.default

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

对于数据框架,用“”替换NA的建议是好的,但是通常会丢失数字;您可以在替换前使用> 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 来完成此操作。有关详细信息,请阅读format.data.frame函数。这样做,你也可以用NA替换,然后使用print.data.frame选项,如上所述。

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   

答案 1 :(得分:0)

这个问题有点令人困惑。但是我认为你有一个有NA的表,你不希望NAs像你给的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

答案 2 :(得分:0)

Aaron的答案(这是一个很好的答案)依赖print.default - 我发现这不太理想,因为我需要使用row.names = FALSEprint.data.table只支持quote=FALSE。 (而且print.data.tableprettyPrintDf <- function(df, ...) # My function print(format.data.frame(data.frame(lapply(df, as.character)), na.encode = FALSE), na.print="", ...) 的默认值,所以不用担心那里。)

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

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

所以给出了像

这样的data.frame
> prettyPrintDf(some_df, row.names=FALSE)
 a b c
 1 4 a
 2   b
   6 c

你可以这样做:

Select id_tr
      ,subcost=sum(subcost)
 From  YourTableName
 Where id_tr='tr02'
Group by id_tr