R中数据框中多个变量的报告频率

Report frequency for multiple variables in a dataframe in R

我有一个包含调查数据的数据框。我想生成一份 table 格式的报告,其中包含每个变量的频率。

所以使用数据集 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

我想制作这样的 table(或类似的东西):

variable n
cyl
4 11
6 7
8 14
gear
3 15
4 12
5 5

知道如何实现这一点吗?

下面的输出格式略有不同。但是,它确实允许子集(使用 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

我们可以编写一对嵌套函数来映射 count 到多个变量和 row-bind 结果,使用一点整洁的评估:

library(tidyverse)

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

mtcars %>% 
  count_multi(cyl, gear)

输出:

  Variable Value  n
1      cyl     4 11
2      cyl     6  7
3      cyl     8 14
4     gear     3 15
5     gear     4 12
6     gear     5  5

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