2013-05-16 111 views
1

我有三個維度的一組數據,從計數:尋找比例

df <- data.frame(type = c("A", "B", "B", "A", "A", "C", "B", "C"), group = c("Tp", "Tp", "Tp", "Tp", "Fc", "Fc", "Fc", "Fc"), size = c(10,20,30,40,10,20,30,40), count = c(1, 4, 2, 3, 2, 10, 2, 3)) 

    type group size count 
1 A Tp 10  1 
2 B Tp 20  4 
3 B Tp 30  2 
4 A Tp 40  3 
5 A Fc 10  2 
6 C Fc 20 10 
7 B Fc 30  2 
8 C Fc 40  3 

我想找到每個數佔比例但在既有型又維度分組子集。也就是說,例如,「Tp」組和「A」組的大小爲10的組合是什麼?

我以爲有可能是aggregateplyr包內的東西,但會根據子集計算每行數據,但我似乎無法找到它。我最大的努力是使用apply:

df$prop <- apply(df, 1, function(x) as.numeric(x["count"])/sum(df[df$type==x["type"] & df$group==x["group"], "count"])) 

    type group size count  prop 
1 A Tp 10  1 0.2500000 
2 B Tp 20  4 0.6666667 
3 B Tp 30  2 0.3333333 
4 A Tp 40  3 0.7500000 
5 A Fc 10  2 1.0000000 
6 C Fc 20 10 0.7692308 
7 B Fc 30  2 1.0000000 
8 C Fc 40  3 0.2307692 

我只是想知道是否有更簡單的方法來做到這一點?如果沒有,我會把它寫成一個自定義函數。

謝謝。

+1

你df'的'定義缺少大小柱。 –

+0

已更新。謝謝! – MattLBeck

回答

2

嘗試:

transform(df, prop=count/ave(count, type, group, FUN=sum)) 
+0

所以我失蹤的功能是'ave'。我從來沒有使用'transform',但看起來它只是省略了一些輸入。謝謝! – MattLBeck

1

隨着plyr,

ddply(df, c("type","group"), mutate, prop = count/sum(count)) 

    type group size count  prop 
1 A Fc 10  2 1.0000000 
2 A Tp 10  1 0.2500000 
3 A Tp 40  3 0.7500000 
4 B Fc 30  2 1.0000000 
5 B Tp 20  4 0.6666667 
6 B Tp 30  2 0.3333333 
7 C Fc 20 10 0.7692308 
8 C Fc 40  3 0.2307692 
0

好得多縮放和國際海事組織更直觀的方式data.table

library(data.table) 
dt = data.table(df) 

dt[, prop := count/sum(count), by = list(type, group)]