Подтвердить что ты не робот

Найти количество строк, используя dplyr/group_by

Я использую набор данных 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() работать для меня?

4b9b3361

Ответ 1

В 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

Ответ 2

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

mtcars %>% 
  dplyr::group_by(cyl, gear) %>%
  dplyr::summarise(length(gear))

Ответ 3

Другая опция, необязательно более элегантная, но не требующая обращения к определенному столбцу:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))

Ответ 4

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

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

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