2009-11-23 63 views
8

我目前在熔化表上使用cast來計算ID變量ID1(行名稱)和ID2(列標題)組合的每個值的總數以及每個值的總計行使用margins="grand_col"使用plyr計算行總數的百分比

c <- cast(m, ID1 ~ ID2, sum, margins="grand_col")

ID1  ID2a ID2b  ID2c  ID2d ID2e (all) 
1 ID1a 6459695 885473 648019 453613 1777308 10224108 
2 ID1b 7263529 1411355 587785 612730 2458672 12334071 
3 ID1c 7740364 1253524 682977 886897 3559283 14123045 

到目前爲止,R-等。

然後我將每個單元格的行總數除以得到總數的百分比。

c[,2:6]<-c[,2:6]/c[,7] 

這看起來很爛。我在castplyr中應該做些什麼來處理第一個命令中保證金計算的百分比?

謝謝, 馬特

+0

我沒有任何偉大的想法在這裏。我希望別人呢! – hadley 2009-11-23 23:32:13

回答

4

假設你的源表看起來是這樣的:

dfm <- structure(list(ID1 = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("ID1a", "ID1b", "ID1c" 
), class = "factor"), ID2 = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("ID2a", 
"ID2b", "ID2c", "ID2d", "ID2e"), class = "factor"), value = c(6459695L, 
7263529L, 7740364L, 885473L, 1411355L, 1253524L, 648019L, 587785L, 
682977L, 453613L, 612730L, 886897L, 1777308L, 2458672L, 3559283L 
)), .Names = c("ID1", "ID2", "value"), row.names = c(NA, 
-15L), class = "data.frame") 

> head(dfm) 
    ID1 ID2 value 
1 ID1a ID2a 6459695 
2 ID1b ID2a 7263529 
3 ID1c ID2a 7740364 
4 ID1a ID2b 885473 
5 ID1b ID2b 1411355 
6 ID1c ID2b 1253524 

使用ddply先計算百分比,並cast以所需的格式呈現數據

library(reshape) 
library(plyr) 

df1 <- ddply(dfm, .(ID1), summarise, ID2 = ID2, pct = value/sum(value)) 
dfc <- cast(df1, ID1 ~ ID2) 

dfc 
    ID1  ID2a  ID2b  ID2c  ID2d  ID2e 
1 ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350 
2 ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399 
3 ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195 

與您的示例相比,這是缺少行總計,這些需要添加sep arately。

但是不知道這個解決方案是否比您目前的解決方案更優雅。

+0

這是一個更好的解決方案,只是因爲列索引不需要硬編碼,而且我可以沒有列總數。檢查爲答案。 同時,您的ddply命令中的ID2 = ID2參數發生了什麼? – 2009-11-24 13:37:45

+0

ddply的彙總參數創建一個新的數據框,如果未指定ID2,則新數據框將只有兩列--ID1和pct。 – learnr 2009-11-24 14:10:27

4

這是一個使用tapplyprop.table的單線程。它不依賴於任何若干輔助包:

prop.table(tapply(dfm$value, dfm[1:2], sum), 1) 

,並提供:

 ID2 
ID1   ID2a  ID2b  ID2c  ID2d  ID2e 
    ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350 
    ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399 
    ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195 

或本該更短:

prop.table(xtabs(value ~., dfm), 1)