Подсчитайте количество строк по группе с помощью dplyr

Я использую набор данных mtcars. Я хочу найти количество записей для определенной комбинации данных. Что-то очень похожее на предложение count(*) group by в SQL. ddply() от plyr работает на меня

library(plyr)
ddply(mtcars, .(cyl,gear),nrow)

имеет выход

  cyl gear V1
1   4    3  1
2   4    4  8
3   4    5  2
4   6    3  2
5   6    4  4
6   6    5  1
7   8    3 12
8   8    5  2

Используя этот код

library(dplyr)
g <- group_by(mtcars, cyl, gear)
summarise(g, length(gear))

имеет выход

  length(cyl)
1          32

Я нашел различные функции, которые можно передать summarise(), но, похоже, ни одна из них у меня не работает. Я нашел одну функцию sum(G), которая вернула

Error in eval(expr, envir, enclos) : object 'G' not found

Пробовал использовать n(), который вернул

Error in n() : This function should not be called directly

Что я делаю неправильно? Как я могу заставить group_by() / summarise() работать на меня?


person charmee    schedule 31.03.2014    source источник
comment
Я не могу воспроизвести это. Я получаю тот же результат, что и ddply. На какой версии dplyr вы работаете? Попробовать обновить?   -  person joran    schedule 31.03.2014
comment
У меня последняя версия 0.1.3. У вас 0.1.2 стоит?   -  person charmee    schedule 31.03.2014
comment
Неа. Ваш пример отлично работает для меня с 0.1.3.   -  person joran    schedule 31.03.2014
comment
Какая у вас версия R? Может ли это быть причиной разницы в поведении? Я также пробовал это на домашнем компьютере, который использует Ubuntu, то же самое ..   -  person charmee    schedule 31.03.2014
comment
Я использую 3.0.2, но я был бы удивлен, если это имеет значение, если только ваша версия R не очень, очень старая.   -  person joran    schedule 31.03.2014
comment
Я тоже на 3.0.2. Я просмотрел бесчисленное количество блогов и руководств с прошлой недели перед публикацией. Если это не сработает, есть ли другой способ подсчитать количество строк для комбинации?   -  person charmee    schedule 31.03.2014
comment
‹Shrug› Начните с самого начала, попробуйте в чистом сеансе R без загруженных других пакетов. Кстати, ваш пример sum(G) не работает, потому что предположительно G не существует. Может ты имел ввиду g? И ваш пример также отлично работает для меня, используя n().   -  person joran    schedule 31.03.2014
comment
Результат, который вы утверждаете, имел бы смысл только в том случае, если бы g на самом деле не был сгруппирован. Поэтому я бы поискал причину, по которой вы могли бы каким-то образом разгруппировать свой фрейм данных.   -  person joran    schedule 31.03.2014
comment
У меня тоже работает ... Можешь попробовать mtcars %.% group_by(cyl, gear) %.% summarise(length(gear)), дает тот же результат.   -  person Victorp    schedule 31.03.2014
comment
Спасибо!!! Это решило ее. Если ко мне прикреплены пакеты plyr и dplyr, summarize не будет работать должным образом. Как только я перезапустил сеанс (и по умолчанию не подключил все обычные пакеты), я смог заставить его работать. Уф.   -  person charmee    schedule 31.03.2014
comment
n () также работает после того, как я отключил пакет plyr. Итак, главный виновник пакета plyr, который мешает пакету dplyr. Еще раз спасибо за помощь !!!   -  person charmee    schedule 31.03.2014
comment
К вашему сведению, на странице github пакета есть предупреждение.   -  person joran    schedule 31.03.2014
comment
Спасибо, вы правы. Как только я следую рекомендованному порядку, все работает нормально.   -  person charmee    schedule 01.04.2014


Ответы (4)


В dplyr есть специальная функция n() для подсчета строк (возможно, внутри групп):

library(dplyr)
mtcars %>% 
  group_by(cyl, gear) %>% 
  summarise(n = n())
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2

Но dplyr также предлагает удобную count функцию, которая делает то же самое с меньшим набором текста:

count(mtcars, cyl, gear)          # or mtcars %>% count(cyl, gear)
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2
person talat    schedule 18.01.2016

другой подход - использовать двойные двоеточия:

mtcars %>% 
  dplyr::group_by(cyl, gear) %>%
  dplyr::summarise(length(gear))
person user3026255    schedule 03.04.2014

Я думаю, что вы ищете следующее.

cars_by_cylinders_gears <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(count = n())

Это использует пакет dplyr. По сути, это полная версия решения count (), предоставляемого docendo discimus.

person tb.    schedule 05.02.2019
comment
Работает для меня. Важнейшей частью является НЕ указание кавычек вокруг имен столбцов для группировки. - person ivan866; 18.11.2019

Другой вариант, не обязательно более элегантный, но не требующий ссылки на конкретный столбец:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))
person Matifou    schedule 16.01.2016
comment
это просто дает вам nrow набора данных, а не группу - person Hack-R; 20.06.2018