2014-01-13 2 views
0

Каков самый простой способ вычисления процента строк (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 

Но я уверен, что есть метод, который требует меньше ввода.

Решения с plyr и data.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

Смежные вопросы