试图创建一个循环来应用这个函数

Trying to create a loop for applying this function

该函数本身有效,但我试图遍历数据中的所有列,我知道使用 ~apply() 有效,希望您能帮助使用它,谢谢。

library(scales)

factorVars <- select_if(df, is.factor)


## function to tidy up to a summary table
tidy_eval_arrange <- function(.data, var) {
  tidydata <- .data %>%
    count({{var}}) %>%
    mutate(pct = n / sum(n),
           pctlabel = paste0(round(pct * 100), "%")) 
  
  print(tidydata)
}

## The issue is here, prints without calculating the percentage properly.
nm <- names(factorVars)
for(i in seq_along(nm)){
  tidy_eval_arrange(df, nm[i])
}

您在 for 循环中传递字符串并且 {{}} 不适用于字符串(如预期的那样)。

tidy_eval_arrange <- function(.data, var) {
  tidydata <- .data %>%
    count({{var}}) %>%
    mutate(pct = n / sum(n),
           pctlabel = paste0(round(pct * 100), "%")) 
  
  print(tidydata)
}
tidy_eval_arrange(mtcars, "cyl")

#   "cyl"  n pct pctlabel
#1   cyl 32   1     100%

{{}} 用于不带引号的变量。这按预期工作。

tidy_eval_arrange(mtcars, cyl)

#  cyl  n     pct pctlabel
#1   4 11 0.34375      34%
#2   6  7 0.21875      22%
#3   8 14 0.43750      44%

为了让您的代码在 for 循环中工作,请将函数更改为

tidy_eval_arrange <- function(.data, var) {
  tidydata <- .data %>%
    count(.data[[var]]) %>%
    mutate(pct = n / sum(n),
           pctlabel = paste0(round(pct * 100), "%")) 
  
  print(tidydata)
}

如果我们使用 ensym 转换为 symbol 并计算 (!!)

,我们可以传递字符串或不带引号的字符串
library(dplyr)
tidy_eval_arrange <- function(.data, var) {
 tidydata <- .data %>%
    count(!! ensym(var)) %>%
   mutate(pct = n / sum(n),
       pctlabel = paste0(round(pct * 100), "%")) 

  print(tidydata)
 }

-测试(在 dplyr 1.0.4 版本上测试)

tidy_eval_arrange(mtcars, "cyl")
#  cyl  n     pct pctlabel
#1   4 11 0.34375      34%
#2   6  7 0.21875      22%
#3   8 14 0.43750      44%
      
tidy_eval_arrange(mtcars, cyl)
#  cyl  n     pct pctlabel
#1   4 11 0.34375      34%
#2   6  7 0.21875      22%
#3   8 14 0.43750      44%