簡體   English   中英

試圖創建一個循環來應用這個 function

[英]Trying to create a loop for applying this function

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循環中工作,請將 function 更改為

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

如果我們使用ensym轉換為sym bol 並評估 ( !! ),我們可以傳遞字符串或不加引號

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%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM