2012-10-28 21 views
2

我有一個11個變量x 60行的數據框;這些條目是雙值因素('男'/'女'),幷包含NAs。 (每行是一個家庭,最多有11個成員,因此列名爲'A4M1'...'A4M11')。如何從數據框中統計表格因子總和,保留標籤

什麼是最簡單的範例來列出'男','女'的總數,以便他們可以barplot?理想情況下,我的輸出將是一個長度爲2的數字向量,即直接對係數進行操作,因此我們保留標籤

我一直在試圖重塑,熔化,澆鑄,堆棧,製表,表格,colwise,金額,彙總,歸納,通過plyr ...

我當前工作的代碼是:

> tabulate(stack(colwise(as.numeric)(myData), na.rm=TRUE)$values) 
[1] 162 151 

這是不好的,因爲我不想脅迫數字和失去標籤。

見下

table(as.matrix(myData)) 

我的回答也並不理想,因爲它失去因子水平的順序,並返回美國標籤的字母順序排列。

tabulate()似乎是最適合的fn。爲了將數據幀轉換爲列表,我使用了stack(..., na.rm=TRUE)$values,這是笨重的,但是完成了這項工作。 但是stack()是不理想的,因爲它不會在因素上工作,所以我必須將它轉換爲colwise(as.numeric)(myData),這將拋出標籤。 我可以重新申請factor(..., labels=c('Male','Female'))來自tabulate()的輸出,但這只是笨重。 那麼,你能做得更好嗎? (使用標準範式,比寫特定的情況下,代碼等)

> head(myData) 
    A4M1 A4M2 A4M3 A4M4 A4M5 A4M6 A4M7 A4M8 A4M9 A4M10 A4M11 
1 Female Male Male <NA> Male Male Male <NA> <NA> <NA> <NA> 
2 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
3 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
4 Female Male Female <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
5 Female Male Male Female Female Male <NA> <NA> <NA> <NA> <NA> 
6 Female Male Male <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
7 ... 

> str(myData) 
'data.frame': 60 obs. of 11 variables: 
$ A4M1 : Factor w/ 2 levels "Male","Female": 2 2 2 2 2 2 1 2 2 2 ... 
$ A4M2 : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ... 
$ A4M3 : Factor w/ 2 levels "Male","Female": 1 1 1 2 1 1 2 1 1 2 ... 
$ A4M4 : Factor w/ 2 levels "Male","Female": NA NA NA NA 2 NA NA 1 NA 2 ... 
$ A4M5 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 2 NA NA 1 NA 2 ... 
$ A4M6 : Factor w/ 2 levels "Male","Female": 1 NA NA NA 1 NA NA NA NA NA ... 
$ A4M7 : Factor w/ 2 levels "Male","Female": 1 NA NA NA NA NA NA NA NA NA ... 
$ A4M8 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ... 
$ A4M9 : Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ... 
$ A4M10: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ... 
$ A4M11: Factor w/ 2 levels "Male","Female": NA NA NA NA NA NA NA NA NA NA ... 
+0

我可能會錯過一些東西,但會'table(as.matrix(test))'做你所需要的嗎?當barplot(表格(as.matrix(test)))' – thelatemail

+0

我已經發布並且評論它爲什麼不受歡迎時,它會保留barplot中的標籤。級別的數字順序被丟棄。 – smci

+1

您可以恢復順序,使其像變量一樣:'table(as.matrix(test))[levels(test $ A4M3)]' – thelatemail

回答

1

如果您剛剛取消了您的數據,該怎麼辦? 簡單的例子:

test <- data.frame( 
      A4M1=factor(c(1,2,3,1),levels=(1:3),labels=c("one","two","three")), 
      A4M2=factor(c(1,2,2,1),levels=(1:3),labels=c("one","two","three")) 
      ) 

這將保持不變的因素...

str(unlist(test)) 
Factor w/ 3 levels "one","two","three": 1 2 3 1 1 2 2 1 
- attr(*, "names")= chr [1:8] "A4M11" "A4M12" "A4M13" "A4M14" ... 

...併爲您提供您所追求的表的順序(即 - 不按字母順序排列):

> table(unlist(test)) 

    one two three 
    4  3  1 
0

如果你放棄把它當作一系列因素的數據框的想法,你可以做到以下幾點。

> table(as.matrix(myData)) 

Female Male 
    151 162 

然而,這是不受歡迎的,因爲訂單現在是不確定的; table()按標籤的字母順序排序,而不是按層次的數字順序排序。 一般來說,會吸吮;這裏我們可以用rev()解決:

> rev(table(as.matrix(myData))) 

Male Female 
248 253 
相關問題