R中 Dataframe 中多个变量的报告频率

4ktjp1zp  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个调查数据的数据框。我想用表格格式制作一份报告,其中包含每个变量的频率。
使用数据集mtcars,得到:

> count(mtcars, cyl)
  cyl  n
1   4 11
2   6  7
3   8 14
> count(mtcars, gear)
  gear  n
1    3 15
2    4 12
3    5  5

我想制作一个这样的表(或类似的东西):
| 变数|数量|
| - ------|- ------|
| 圆柱体||
| 四个|十一|
| 六个|七|
| 八个|十四|
| 齿轮||
| 三个|十五|
| 四个|十二|
| 五个|五个|
你知道这是如何实现的吗?

bqf10yzr

bqf10yzr1#

我们可以编写一对嵌套的函数,将countMap到多个变量,并对结果进行行绑定,只需简单地求值:

library(dplyr)
library(purrr)

count_multi <- function(.data, ...) {
  count_var <- function(var, .data) {
    .data %>% 
      count(Value = factor({{ var }})) %>%  # coerce to factor to allow multiple
      mutate(                               # var types and preserve ordering
        Variable = as.character(ensym(var)),
        .before = everything()
      )
  }
  map_dfr(enquos(...), count_var, .data = .data)
}

mtcars2 <- mtcars %>% 
  mutate(
    vs = factor(vs, labels = c("V", "S")),
    am = factor(am, labels = c("manual", "automatic"))
  )

mtcars2 %>% 
  count_multi(vs, am, cyl)
    • 输出:**
Variable     Value  n
1       vs         V 18
2       vs         S 14
3       am    manual 19
4       am automatic 13
5      cyl         4 11
6      cyl         6  7
7      cyl         8 14

我相信您可以使用kableExtra::pack_rows()为markdown中的每个Variable创建子标题。

5ssjco0h

5ssjco0h2#

下面的输出格式略有不同。但是,它允许子集(使用OP要求不允许的variable列)。

library(data.table)

df <- setDT(copy(mtcars))

# select columns as grouping by continuous variables is not appropriate
x <- c('cyl', 'gear')

y <- lapply(x, \(i) df[, .N, i])

names(y) <- x

y <- rbindlist(y, idcol=T, use.names=F)

names(y) <- c('variable', 'class', 'count')

   variable class count
1:      cyl     6     7
2:      cyl     4    11
3:      cyl     8    14
4:     gear     4    12
5:     gear     3    15
6:     gear     5     5

相关问题