聚合以计算每组非零行的百分比

时间:2014-01-13 05:35:08

标签: r aggregate

计算包含1的行(1)和(2)每组包含零的百分比的最简单方法是什么?

以下是一些小例子数据:

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 个答案:

答案 0 :(得分: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