如何将tidyverse单变量处理函数改造为支持多变量传入的`...`参数形式
R函数多列适配改造方案
需求说明
原函数foo可将单个数值列重编码为字符串因子列,映射规则为1 --> "a"、2 --> "b"以此类推,同时支持切换大小写、反向排序两个参数。
改造要求:将原函数仅支持单个列的var1参数替换为...参数,所有通过...传入的数值列都要执行相同的重编码逻辑。
改造后代码
library(tidyverse) foo <- function(data, ..., caps = FALSE, reverse = FALSE){ let <- if(caps) base::LETTERS else base::letters FUN <- if(reverse) utils::tail else utils::head data %>% mutate(across(c(...), ~ factor(FUN(let, max(.x))[.x]))) }
示例用法
# 构造包含多个待重编码数值列的测试数据 (dat <- data.frame( var1 = c(2,1,3,1,4:1), var2 = c(1,2,2,3,1,2,3,3), id = 1:8 )) # 同时重编码var1、var2两列,启用大写、反向排序 foo(dat, var1, var2, caps = TRUE, reverse = TRUE)
改造要点说明
- 用
...替换原单字段参数,支持传入任意数量的列,同时兼容tidyverse的列选择语法 - 用
across()遍历所有传入的列,对每一列独立计算最大数值、生成对应映射关系,不同列的重编码逻辑互不干扰 - 保留原函数的
caps(大小写切换)、reverse(反向排序)参数功能不变,所有传入列统一应用这两个参数的设置
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

