使用dplyr按组计数行数

bwleehnv  于 2023-04-18  发布在  其他
关注(0)|答案(5)|浏览(92)

我使用的是mtcars数据集。我想找到特定数据组合的记录数。这与SQL中的count(*) group by子句非常相似。ddply() from 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(),但似乎没有一个对我有用。

Error in eval(expr, envir, enclos) : object 'G' not found

尝试使用n(),它返回

Error in n() : This function should not be called directly

我做错了什么?我如何让group_by()/summarise()为我工作?

yacmzcpb

yacmzcpb1#

在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
wj8zmpe1

wj8zmpe12#

我想你要找的东西如下。

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

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

zkure5ic

zkure5ic3#

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

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

rvpgvaaj4#

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

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
sd2nnvve

sd2nnvve5#

另一种选择是使用来自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

相关问题