我正在尝试创建一个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
提前致谢!!
答案 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 = FALSE
,print.data.table
只支持quote=FALSE
。 (而且print.data.table
是prettyPrintDf <- 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