试图创建一个循环来应用这个函数
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
转换为 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%
该函数本身有效,但我试图遍历数据中的所有列,我知道使用 ~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
转换为 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%