2016-03-30 2 views
8

Скажем, у меня есть набор данных, как это:dplyr подсчет количества одного конкретного значения переменной

id <- c(1, 1, 2, 2, 3, 3) 
code <- c("a", "b", "a", "a", "b", "b") 
dat <- data.frame(id, code) 

Ie,

id code 
1 1 a 
2 1 b 
3 2 a 
4 2 a 
5 3 b 
6 3 b 

Использование dplyr, как бы я получить счет, как многие там являются для каждого идентификатора

т.е.

id countA 
1 1 1 
2 2 2 
3 3 0 

Пытаюсь вещи, как это, не работает,

countA<- dat %>% 
group_by(id) %>% 
summarise(cip.completed= count(code == "a")) 

выше дает мне ошибку «Ошибка: не применяется метод„group_by_“применяется к объекту класса„логического“»

Спасибо за помощь!

ответ

10

Попробуйте следующие вместо:

library(dplyr) 
dat %>% group_by(id) %>% 
    summarise(cip.completed= sum(code == "a")) 

Source: local data frame [3 x 2] 
    id cip.completed 
    (dbl)   (int) 
1  1    1 
2  2    2 
3  3    0 

Это работает, потому что логическое условие code == a является только ряд нулей и единиц, а сумма этого ряда является число вхождений.

Обратите внимание, что вы не обязательно использовать dplyr::count внутри summarise все равно, как это оболочка для summarise вызова либо n() или сам sum(). См. ?dplyr::count. Если вы действительно хотите использовать count, я думаю, вы могли бы сделать это, сначала фильтруя набор данных, чтобы сохранить только все строки, в которых code==a, и используя count, тогда вы получите все строго положительные (т. Е. Ненулевые) подсчеты. Например,

dat %>% filter(code==a) %>% count(id) 

Source: local data frame [2 x 2] 

    id  n 
    (dbl) (int) 
1  1  1 
2  2  2 
+0

Сумма сделки. Спасибо! –

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