R语言dplyr数据屏蔽场景下如何修改函数支持字符串列名输入
R dplyr自定义函数支持字符串列名参数的修改方案
核心问题原因
原function1使用dplyr非标准求值语法{{ }},仅支持传入不带引号的裸列名,当循环传入字符串格式的列名时,dplyr会将字符串本身识别为列名,而非字符串对应的实际数据列,因此运行报错。
修改后的完整代码
library(dplyr) function_1 <- function(df, group, focal, reference){ if (reference == "rest"){ df <- df %>% dplyr::mutate( # 适配字符串列名的赋值逻辑 !!all_of(group) := dplyr::recode(.data[[group]], !!focal := focal, .default = "rest") ) df <- df %>% dplyr::select(ac_id, question_id, question_result_score, all_of(group)) df <- df[!(duplicated(dplyr::select(df, ac_id, question_id))), ] df <- df %>% dplyr::arrange(ac_id) } else{ df <- dplyr::filter(df, .data[[group]] == focal | .data[[group]] == reference) df <- df %>% dplyr::select(ac_id, question_id, question_result_score, all_of(group)) df <- df[!(duplicated(dplyr::select(df, ac_id, question_id))), ] df <- df %>% dplyr::arrange(ac_id) } return(df) }
关键修改说明
- 列值读取:所有需要读取
group列值的位置,统一使用.data[[group]]代词语法,直接适配字符串格式的列名输入 - 列操作指定:
mutate赋值左侧、select中需要指定group列的位置,使用all_of(group)语法处理字符串列名 - 分组值适配:
recode的旧值键位添加!!解引用符,适配动态传入的focal字符串参数 - 未改动
focal、reference参数的核心处理逻辑,二者本身就是字符串类型的分组值参数
调用示例
字符串参数直接调用
# 传入字符串"gender"即可正常运行 function_1(mydata, "gender", "male", "rest")
循环遍历参数表调用
# viable_cat为存储参数的字符矩阵 for (row in 1:nrow(viable_cat)) { res <- function_1( df = mydata, group = viable_cat[row, "group"], focal = viable_cat[row, "focal"], reference = viable_cat[row, "reference"] ) # 此处添加对返回结果res的后续处理逻辑 }
内容的提问来源于stack exchange,提问作者Tom McDonald
相关产品推荐
相关产品推荐

