下面的方法应该可以满足您的需求。它不像我对您问题中链接帖子的回答那么干净,但它应该可以按预期工作(现在还使用适用于所有变量的默认参数进行了更新):
library(tidyverse)
library(rlang)
foo <- function(data, ..., caps = FALSE, reverse = FALSE){
var_ls <- map(ensyms(..., .named = TRUE), as.character)
l_varls <- length(var_ls)
if(l_varls != length(caps)) {
caps <- rep(caps, l_varls)
}
if(l_varls != length(reverse)) {
reverse <- rep(reverse, l_varls)
}
let <- ifelse(caps, list(base::LETTERS), list(base::letters))
names(let) <- names(var_ls)
FUN <- ifelse(reverse, list(utils::tail), list(utils::head))
names(FUN) <- names(var_ls)
mutate(data,
purrr::map_dfc(var_ls,
~ factor(FUN[[.x]](let[[.x]],max(data[[.x]]))[data[[.x]]]))
)
}
# EXAMPLE OF USE:
(dat <- data.frame(var1 = c(2,1,3,1,4:1), var2 = c(8:1), id = 1:8))
#> var1 var2 id
#> 1 2 8 1
#> 2 1 7 2
#> 3 3 6 3
#> 4 1 5 4
#> 5 4 4 5
#> 6 3 3 6
#> 7 2 2 7
#> 8 1 1 8
foo(dat, var1, var2, caps = c(TRUE,FALSE), reverse = c(FALSE, TRUE))
#> var1 var2 id
#> 1 B z 1
#> 2 A y 2
#> 3 C x 3
#> 4 A w 4
#> 5 D v 5
#> 6 C u 6
#> 7 B t 7
#> 8 A s 8
foo(dat, var1, var2)
#> var1 var2 id
#> 1 b h 1
#> 2 a g 2
#> 3 c f 3
#> 4 a e 4
#> 5 d d 5
#> 6 c c 6
#> 7 b b 7
#> 8 a a 8
foo(dat, var1, var2, caps = TRUE, reverse = TRUE)
#> var1 var2 id
#> 1 X Z 1
#> 2 W Y 2
#> 3 Y X 3
#> 4 W W 4
#> 5 Z V 5
#> 6 Y U 6
#> 7 X T 7
#> 8 W S 8
由reprex package (v0.3.0) 于 2021-09-18 创建