使用 dplyr 按组计算行数

问题描述 投票:0回答:6

我正在使用

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

r dplyr count plyr
6个回答
188
投票

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

23
投票

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

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

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


21
投票

另一种方法是使用双冒号,因为这将有助于避免与其他包中具有相似名称的函数发生潜在冲突。

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

3
投票

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

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

1
投票

另一种选择是使用 dplyr 中的函数

tally
。这是一个可重现的示例:

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

创建于 2022-09-11,使用 reprex v2.0.2


0
投票

可以简单地使用

dplyr
:

来完成此操作
library(dplyr)

# Use the function add_count() and name the new variable as "count"

mtcars %>%
  add_count(cyl, gear, name = "count")
© www.soinside.com 2019 - 2024. All rights reserved.