2012-05-08 64 views
2

我想創建一個data.frame,其中一些單元格缺少值。我不知道是否有任何方法來隱藏新輔助器,而不是展示新輔助器?我想要的基本上就像下面顯示的ANOVA表。是否有可能不在數據框中顯示NAs?

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

我很困惑 - 當你做'anova(model1,model2)'的時候,你返回的對象中的NA(例如你注意到的'[1,4]')不會被顯示出來。那麼,「不顯示」是什麼意思?你在做什麼,這顯示了他們? –

+0

對不起,我不清楚。我正在爲我寫的腳本的輸出做一個表格。但是NAs總是顯示爲NAs,而不是像anova()輸出中那樣隱藏。所以基本上我想我的輸出表就像anova()輸出一樣。 – Alex

回答

6

print.anova的作品,像這樣:

> 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  
+0

感謝您的幫助!我其實不介意使用矩陣。我決定改變rownames,使它看起來更好,更像矩陣。我之前曾想過用「」替換NAs,但是決定不這樣做,因爲我希望輸出可以很容易地作爲數字來訪問。 – Alex

+0

很高興爲您提供幫助。如果此答案已解決您的問題,請點擊複選標記以讓其他人知道這對您有幫助,並且您的問題已解決。 – Aaron

0

這個問題有點混亂。但是我認爲你有一張桌上有NAs的桌子,你不希望新秀出現在你給的anova桌子上?如果這是正確的,你可以索引來查找來港,並與「」替換:通過使用print.defaultna.print選項

(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 
+0

我真的希望我的桌子看起來像anova桌子......抱歉沒有說清楚。但通常情況下,數據框架中的NAs是可見的,而且I *不希望它們可見。 – Alex

0

阿龍的回答(這是一個很好的)依靠print.default - 我發現理想這個少,因爲我需要使用row.names = FALSE,這是隻有在print.data.table支持。 (並且quote=FALSEprint.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="", ...) 

所以給喜歡

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 
相關問題