2014-01-13 94 views
0

計算每個組包含1個行和(2個)包含零的行(1)百分比的最簡單方法是什麼?聚合計算每個組中非零行的百分比

下面是一些小例子數據:

dat <- structure(list(rs = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0), group = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("rs", "group"), row.names = c(NA, 
-62L), class = "data.frame") 

這裏是我到目前爲止得到了(不要笑!):

require(plyr)  
tab <- as.data.frame(table(dat)) 
dc <- dcast(tab, group ~ rs) 
dc <- dc[,-1] 
dc[] <- lapply(dc, as.numeric) 
data.frame(prop.table(as.matrix(dc), 1)) 

的正常工作:

  X0   X1 
1 1.0000000 0.00000000 
2 0.8787879 0.12121212 
3 0.9285714 0.07142857 

但我確定有一種方法需要較少的打字。

最受歡迎的解決方案有plyrdata.table

回答

1

table幾乎做你想要的。通過它的總和除以各組值轉換爲比:

t(apply(table(dat), 2, function(x) x/sum(x))) 

## group   0   1 
##  1 1.0000000 0.00000000 
##  2 0.8787879 0.12121212 
##  3 0.9285714 0.07142857 
+0

是的,這是一個很好的方法短,由於 – Ben

+1

'噸(prop.table(帶(DAT,表(RS,基團)),2) )'作爲一種變化。 – thelatemail