如何在一次操作中使用count()函数统计多列频数
需求说明
我平时用dplyr的count()函数统计单列频数,示例代码如下:
library(dplyr) mtcars %>% count(cyl)
mtcars %>% count(am)
mtcars %>% count(gear)
现在想一次性完成cyl、am、gear这三列的独立频数统计,注意不是联合统计(比如count(cyl, am, gear)这种组合统计方式)。我自己已有可行实现,但想知道更简洁的写法。
我当前的实现代码:
library(dplyr) library(tidyr) mtcars %>% count(am) %>% bind_rows(mtcars %>% count(cyl)) %>% bind_rows(mtcars %>% count(gear)) %>% pivot_longer(-n, values_drop_na = TRUE) %>% unite("variable", c("name", "value")) %>% relocate(variable, n)
运行结果:
variable n <chr> <int> 1 am_0 19 2 am_1 13 3 cyl_4 11 4 cyl_6 7 5 cyl_8 14 6 gear_3 15 7 gear_4 12 8 gear_5 5
简洁实现方案
可以通过先转长格式再统一统计的方式,大幅简化代码:
library(dplyr) library(tidyr) mtcars %>% select(cyl, am, gear) %>% pivot_longer(everything(), names_to = "var", values_to = "val") %>% count(var, val) %>% unite(variable, var, val, sep = "_") %>% relocate(variable, n)
运行结果和原实现完全一致。
逻辑说明
select(cyl, am, gear):筛选出需要统计的目标列,排除无关列pivot_longer(...):将多列转为长格式,把原列名存入var,对应值存入valcount(var, val):按列名和值分组统计,一步完成所有目标列的独立频数统计unite(...):合并列名与值,生成要求的variable格式relocate(...):调整列顺序,匹配原输出结构
这种写法无需多次重复调用count和bind_rows,代码更紧凑,逻辑更连贯。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

