Підрахуйте кількість рядків за групою, використовуючи dplyr


83

Я використовую 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()працювати на мене?


Я не можу відтворити це. Я отримую той самий результат, що і з ddply. На якій версії dplyr ви працюєте? Спробувати оновити?
Джоран

У мене остання версія 0.1.3. У вас 0.1.2?
charmee

Ні. Ваш приклад чудово працює для мене з 0.1.3.
Джоран

1
Яка версія R у вас є? Чи може це спричинити різницю в поведінці? Я також спробував це на комп’ютері вдома, який використовує Ubuntu, те саме ...
charmee

2
Дякую!!! Це вирішило. Якщо до мене приєднані як пакети plyr, так і dplyr, резюме не працює належним чином. Як тільки я перезапустив сеанс (і за замовчуванням не приєднав усі звичайні пакети), я зміг змусити його працювати. Фу.
charmee

Відповіді:


126

У n()dplyr є спеціальна функція для підрахунку рядків (можливо в групах):

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

16

інший підхід полягає у використанні подвійних двокрапок:

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

9

Я думаю, що ви шукаєте наступне.

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

Для цього використовується пакет dplyr. Це, по суті, довготермінова версія рішення count (), яку надає docendo discimus.


Працює для мене. Найважливішою частиною є НЕ вказання лапок навколо назв стовпців, за якими потрібно групувати.
ivan866

3

Інший варіант, не обов'язково більш елегантний, але не вимагає посилання на певний стовпець:

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

1
це просто дає вам nrowнабір даних, а не групу
Hack-R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.