我正在使用
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()
为我工作?
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())
这是使用 dplyr 包。这本质上是 docendo discimus 提供的 count() 解决方案的普通版本。
另一种方法是使用双冒号,因为这将有助于避免与其他包中具有相似名称的函数发生潜在冲突。
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
中的函数
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
可以简单地使用
dplyr
: 来完成此操作
library(dplyr)
# Use the function add_count() and name the new variable as "count"
mtcars %>%
add_count(cyl, gear, name = "count")