在R语言中编写基于布尔参数排除指定关键词列名的函数
修正后的R函数实现方案
先说说你原函数里的几个关键问题:
- 逻辑条件写法错误:
contains("ABS_CHANGE" | contains("EUR"))是语法错误,正确的逻辑应该是对两个contains结果做或运算,或者用正则匹配多个关键词 select语句的括号没有闭合,导致代码无法运行return(df)写在了函数体外,不会被执行
下面是修正并优化后的函数,完全符合你的需求:
library(dplyr) test_func <- function(df, difference) { if (difference) { # 当difference为TRUE时,排除含ABS_CHANGE和EUR的列 df <- df %>% select(-contains("ABS_CHANGE"), -contains("EUR")) } else { # 当difference为FALSE时,排除含PERC_CHANGE和EUR的列 df <- df %>% select(-contains("PERC_CHANGE"), -contains("EUR")) } return(df) }
补充说明:
- 我们用
contains()分别匹配两个关键词,并用-前缀排除这些列,写法更清晰不易出错;你也可以用正则表达式简化,比如把select语句改成select(-matches("ABS_CHANGE|EUR")),效果完全一致 - 因为
difference是布尔型参数,直接写if (difference)就可以,不用==TRUE,更符合R的代码风格 - 函数返回修正后的数据集,同时保留原数据集的分组属性(
select操作不会移除分组)
测试验证:
调用test_func(df, difference=FALSE),会排除所有含PERC_CHANGE和EUR的列,返回的列是:SCENARIO, INSTITUTE, METHOD_DEC, CLASS, ABS_CHANGE_N_2021, ABS_CHANGE_N_2022
调用test_func(df, difference=TRUE),会排除所有含ABS_CHANGE和EUR的列,返回的列是:SCENARIO, INSTITUTE, METHOD_DEC, CLASS, PERC_CHANGE_N_2022, PERC_CHANGE_N_2023
内容的提问来源于stack exchange,提问作者Ingrid
相关产品推荐
相关产品推荐

