【问题标题】:Trying to create a loop for applying this function试图创建一个循环来应用这个函数
【发布时间】:2021-05-22 06:25:51
【问题描述】:

该函数本身可以工作,但我正在尝试遍历数据中的所有列,我知道使用 ~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])
}

【问题讨论】:

  • 什么是df?您能否提供一些示例数据,以便我们reproduce您的问题?
  • 嗨@Joe Roe,df 是我们要测试的数据框。

标签: r function for-loop apply summarize


【解决方案1】:

如果我们使用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)
 }

-testing(在dplyr1.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%

【讨论】:

    【解决方案2】:

    您在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)
    }
    

    【讨论】:

    • 这确实有效,有趣的是,括号的正确使用有多大差异。谢谢@Ronak
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多