рассчитать скорость по тому же в использовании R

У меня вопрос по расчету ставки под одинаковыми номерами id. Вот пример набора данных d:

id answer
1   1
1   0
1   0
1   1
1   1
1   1
1   0
2   0
2   0
2   0
3   1
3   0

Идеальный выход это

id  rate          freq
1   4/7 (=0.5714)  7
2   0              3
3   1/2 (=0.5)     2

Спасибо.


person user3849475    schedule 08.04.2015    source источник


Ответы (2)


Пытаться

library(data.table)
setDT(df1)[,list(rate= mean(answer), freq=.N) ,id]
#   id      rate freq
#1:  1 0.5714286    7
#2:  2 0.0000000    3
#3:  3 0.5000000    2

Or

library(dplyr)
 df1 %>% 
    group_by(id) %>%
    summarise(rate=mean(answer), freq=n())

данные

df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L), answer = c(1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L)), .Names = c("id", "answer"), class = "data.frame", 
row.names = c(NA, -12L))
person akrun    schedule 08.04.2015
comment
Есть ли причина, по которой вы используете не использовать mean в подходе dplyr? - person talat; 08.04.2015
comment
@docendodiscimus Сначала я закодировал его как sum()/n(), так как mean не щелкнул для меня, глядя на ожидаемый результат. Потом я понял, что mean работает и забыл поменять на dplyr - person akrun; 08.04.2015

Просто для удовольствия вы можете использовать aggregate

> aggregate(answer~id, function(x) c(rate=mean(x), freq=length(x)), data=df1)
  id answer.rate answer.freq
1  1   0.5714286   7.0000000
2  2   0.0000000   3.0000000
3  3   0.5000000   2.0000000
person Jilber Urbina    schedule 08.04.2015
comment
В зависимости от того, что вы хотите получить в качестве вывода, вы можете добавить этот оператор после оператора aggregate, где ag — это вывод оператора aggregate: with(ag, data.frame(id, answer)) - person G. Grothendieck; 08.04.2015