使用 dplyr 按组计算行数

我正在使用 mtcars数据集。我想找出特定数据组合的记录数。非常类似于 SQL 中的 count(*)组 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

Using this code

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

207475 次浏览

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

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

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

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

这相当于使用 count():

library(dplyr, warn.conflicts = FALSE)
all.equal(mtcars %>%
group_by(cyl, gear) %>%
do(data.frame(n=nrow(.))) %>%
ungroup(),
count(mtcars, cyl, gear), check.attributes=FALSE)
#> [1] TRUE

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

我想你要找的东西如下。

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

This is using the dplyr package. This is essentially the longhand version of the count () solution provided by docendo discimus.

Another option is using the function 意大利 from dplyr. Here is a reproducible example:

library(dplyr)
mtcars %>%
group_by(cyl, gear) %>%
tally()
#> # A tibble: 8 × 3
#> # Groups:   cyl [3]
#>     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

Created on 2022-09-11 with Reprex v2.0.2