如何用Tidyeval编写自定义函数,基于数字拼接的现有变量名操作?
解决:用数字参数定位现有变量并完成重编码
需求回顾
要写个自定义函数:
- 传个数字参数,和指定前缀拼起来,找到数据里已经存在的对应变量
- 直接修改这个已有变量(不是新建)
- 用来处理那些带有序列数字的变量重编码场景
原代码问题点
你原来的代码里,main_var是拼出来的字符串变量名,但在mutate里直接赋值的话,是把字符串本身给了新变量,根本没引用到数据里的blah1234。得把字符串转成dplyr能识别的变量符号才行。
修正后的可用代码
library(dplyr) # 先造个测试数据,包含blah1234和blah5678两个变量 mtcars_revid <- mtcars %>% mutate(blah1234 = drat, blah5678 = wt) # 自定义函数:定位现有变量并修改 test_func <- function(data, initial_var_num, prefix = "blah") { # 拼出目标变量的名字(字符串形式) target_var_name <- paste0(prefix, initial_var_num) # 把字符串转成dplyr能识别的变量符号 target_var <- sym(target_var_name) # 直接修改目标变量:符合条件保留原值,否则设为NA data %>% mutate(!!target_var := ifelse(!!target_var < 999998, !!target_var, NA)) } # 测试:修改blah1234 result <- mtcars_revid %>% test_func(1234) # 验证修改前后均值一致(因为原变量值都小于999998,所以没变化) result %>% summarize(修改后均值 = mean(blah1234), 原均值 = mean(mtcars_revid$blah1234))
关键说明
sym():把字符串格式的变量名转成符号,这样dplyr才知道要找数据里的对应变量!!:相当于“把这个符号变量注入到代码里”,让dplyr能正确引用和修改目标变量- 加了
prefix参数,方便你换不同的前缀,适配更多场景
批量处理扩展(如果需要)
要是有一堆带有序列数字的变量要处理,结合purrr包批量操作:
library(purrr) # 一次性处理blah1234和blah5678 batch_result <- reduce(c(1234, 5678), ~test_func(.x, .y), .init = mtcars_revid) # 查看所有blah开头的变量均值 batch_result %>% summarize(across(starts_with("blah"), mean))
内容的提问来源于stack exchange,提问作者Jack Landry
相关产品推荐
相关产品推荐

