如何应用多列来制作 R 中数据框的摘要列表

How to apply multiple columns to make a summary list of dataframes in R

我正在尝试自动执行此代码,但不知道如何使用 apply 或 map 函数来完成它!

这是设置:

data("mtcars")
count_to_pct <- function(data,..., col = n) {

  grouping_vars_expr<- quos(...)
  col_expr<- enquo(col)

  data %>%
    group_by(!!! grouping_vars_expr) %>%
    mutate(pct = (!! col_expr) / sum(!! col_expr)) %>%
    ungroup()

}

问题来了:重复代码!为了我自己的理智而试图清理它。如何通过 data %>% count(column) %>% count_to_pct() 传递列表?

dataframes<- list(
  mtcars %>% count(vs) %>% count_to_pct(),                                      
  mtcars %>% count(am) %>% count_to_pct(),                                      
  mtcars %>% count(gear) %>% count_to_pct(),                                      
  mtcars %>% count(carb) %>% count_to_pct())

获取长格式数据,count,拆分每个 name 并使用 count_to_pct

library(dplyr)
library(tidyr)
library(purrr)

mtcars %>%
  pivot_longer(cols = c(vs, am, gear, carb)) %>%
  count(name, value) %>%
  group_split(name) %>%
  map(count_to_pct)

如果不使用count_to_pct函数,其实会简单很多。

mtcars %>%
  pivot_longer(cols = c(vs, am, gear, carb)) %>%
  count(name, value) %>%
  group_by(name) %>%
  mutate(n = n/sum(n))


#  name  value      n
#   <chr> <dbl>  <dbl>
# 1 am        0 0.594 
# 2 am        1 0.406 
# 3 carb      1 0.219 
# 4 carb      2 0.312 
# 5 carb      3 0.0938
# 6 carb      4 0.312 
# 7 carb      6 0.0312
# 8 carb      8 0.0312
# 9 gear      3 0.469 
#10 gear      4 0.375 
#11 gear      5 0.156 
#12 vs        0 0.562 
#13 vs        1 0.438 

如果你通过字符名来引用你的列名,你可以使用lapplyrlang::sym将字符名转换为可以在dplyr中使用的列符号,见 :

dataframes_list <- lapply(c("vs", "am", "gear", "carb"), function(x) {
  mtcars %>% count(!!rlang::sym(x)) %>% count_to_pct()
})