【问题标题】:Count number of rows by group using dplyr使用 dplyr 按组计算行数
【发布时间】:2014-05-11 03:57:42
【问题描述】:

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

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 吗?
  • 不。您的示例对我来说适用于 0.1.3。
  • 你有什么版本的R?这会导致行为上的差异吗?我也在家里的一台使用 Ubuntu 的电脑上试过这个,同样的事情..
  • 谢谢!!!那解决了它。如果我同时附加了 plyr 和 dplyr 包,则汇总无法按预期工作。一旦我重新启动会话(并且默认情况下没有附加所有普通包),我就能够使其工作。唷。

标签: r dplyr count plyr


【解决方案1】:

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

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

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

【讨论】:

  • 为我工作。关键部分不是指定要分组的列名周围的引号。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这只是给你数据集的nrow 而不是组
      猜你喜欢
      • 2015-04-13
      • 2018-07-24
      • 1970-01-01
      • 2021-10-01
      • 2018-03-21
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多