使用dplyr按组计算行数


81

我正在使用mtcars数据集。我想查找特定数据组合的记录数。与count(*)SQL中的group by子句非常相似。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?尝试更新?
2014年

我有最新的版本0.1.3。你有0.1.2吗?
魅惑者

不。您的示例对我来说效果很好,为0.1.3。
joran 2014年

1
您有什么版本的R?会造成行为上的差异吗?我也在家里使用Ubuntu的计算机上尝试过此操作,同样的事情..
charmee 2014年

2
谢谢!!!那解决了。如果我同时附有plyr和dplyr软件包,则Summary无法按预期方式工作。一旦我重新启动了会话(默认情况下并没有附加所有正常的软件包),我就能够使其正常工作。ew
charmee

Answers:


123

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))

8

我认为您正在寻找的如下。

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

这是使用dplyr软件包。本质上,这是docendo discimus提供的count()解决方案的简化版本。


为我工作。关键部分是不要指定要分组的列名周围的引号。
ivan866 '19

3

另一个选择,不一定会更优雅,但不需要引用特定的列:

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

1
只是给您nrow数据集的而不是组的数据
Hack-R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.