2013-10-21 78 views
1

我相信這個問題有一個簡單的答案,但我找不到它。R:將函數應用於表併合並結果列表

我使用sapply總結了一個包含數千個觀察值的表格。每個觀測含有10種類型中的一個(編碼爲 「R」, 「B」,等等)表中的每一個柱( 「ASPRU」, 「ASPPL」 等):

 ASPRU ASPBG ASPBY ASPCZ ASPHR ASPMK ASPPL ASPPLA ASPSK ASPSL ASPSR ASPSRA 
...  
460  I  -  I  Z  I  I  I  -  -  I  I  I 
461  I  -  I  -  I  I  I  -  Z  I  -  I 
462  I  -  -  Z  I  -  -  -  -  -  -  - 
463  Z  Z  Z  -  Z  -  Z  Z  Z  I  I  Z 
477  -  -  -  O  -  -  N  -  -  -  -  - 
478  -  -  I  -  -  I  I  -  -  -  I  I 
479  -  Z  I  -  I  -  -  -  -  -  I  I 
480  -  I  I  I  -  -  -  Z  -  -  -  - 
482  -  -  -  -  K  -  -  -  -  -  -  K 
483  O  -  -  -  O  -  O  -  -  -  -  O 
484  O  -  I  -  -  -  N  O  -  A  -  O 

我使用sapply和表:

sapply(colnames(NomSuff), function(x) {t(as.table(table(NomSuff[,x])))}) 

獲得每列存在的頻率列表。這是這樣的

$ASPRU 

    - A C I K L N O R S V Z М 
8352 136 115 697 75 92 147 265 24 142 48 61 193 

$ASPBG 

    - A C I K L N O S Z М 
8899 191 119 388 14 128 183 193 93 76 63 

$ASPBY 

    - A C I K N O S Z М 
9194 92 85 385 18 160 213 71 60 69 

注意,用於每列符號的集合是不同的列表。現在,顯然我需要一個類似下面的表格,每列的頻率合併起來,即

 -  A C I K L N O S Z М 
ASPBG 8899 191 119 388 14 128 183 193 93 76 63 
ASPBY 9194 92 85 385 NA 18 160 213 71 60 69 

(更好的是,用0代替NA)。

我找不到辦法做到這一點。我試過幾種方式合併,但我想問題是我無法找到如何將適當格式的列表轉換爲合併。

回答

3

讀您的數據:

df <- read.table(text='ASPRU ASPBG ASPBY ASPCZ ASPHR ASPMK ASPPL ASPPLA ASPSK ASPSL ASPSR ASPSRA 
460  I  -  I  Z  I  I  I  -  -  I  I  I 
461  I  -  I  -  I  I  I  -  Z  I  -  I 
462  I  -  -  Z  I  -  -  -  -  -  -  - 
463  Z  Z  Z  -  Z  -  Z  Z  Z  I  I  Z 
477  -  -  -  O  -  -  N  -  -  -  -  - 
478  -  -  I  -  -  I  I  -  -  -  I  I 
479  -  Z  I  -  I  -  -  -  -  -  I  I 
480  -  I  I  I  -  -  -  Z  -  -  -  - 
482  -  -  -  -  K  -  -  -  -  -  -  K 
483  O  -  -  -  O  -  O  -  -  -  -  O 
484  O  -  I  -  -  -  N  O  -  A  -  O', header=TRUE, stringsAsFactors=T) 

轉換的一切因素,tablerbind

do.call(rbind,lapply(df, function(x) table(factor(x, levels=c(levels(unlist(df))))))) 

結果:

 - I O Z K N A 
ASPRU 5 3 2 1 0 0 0 
ASPBG 8 1 0 2 0 0 0 
ASPBY 4 6 0 1 0 0 0 
ASPCZ 7 1 1 2 0 0 0 
ASPHR 4 4 1 1 1 0 0 
ASPMK 8 3 0 0 0 0 0 
ASPPL 4 3 1 1 0 2 0 
ASPPLA 8 0 1 2 0 0 0 
ASPSK 9 0 0 2 0 0 0 
ASPSL 7 3 0 0 0 0 1 
ASPSR 7 4 0 0 0 0 0 
ASPSRA 3 4 2 1 1 0 0 
+0

非常整潔。非常感謝!現在我只需要找到一個函數來給我df中所有符號的清單。 –

+0

試試'levels(unlist(df))'。 – fotNelton

+0

謝謝,這是我真正想要的。我相應地更新了答案。 –

相關問題