使用dplyr / group_by查找行数

时间:2014-03-31 17:11:15

标签: r dplyr plyr

我正在使用mtcars数据集。我想找到特定数据组合的记录数。与SQL中的count(*) group by子句非常相似的东西。来自 plyr ddply()正在为我工​​作

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()为我工作?

4 个答案:

答案 0 :(得分:97)

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

答案 1 :(得分:14)

另一种方法是使用双冒号:

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

答案 2 :(得分:3)

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

var vm = this;
AuthService.login(user.name,user.password).then(function() {
      $state.go('dashboard');
    },function(error) {
      vm.user.password = '';
      ngDialog.open({
        template: '<h2>Error</h2><p>{{error}}</p>',
        plain: true
      });
    })

答案 3 :(得分:1)

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

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

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