我想用多个输入编写一个函数。
每个输入都会调整dplyr管道中的特定过滤器参数。
我正在努力开启/关闭grep参数,
也就是说,我希望能够完全忽略grep行
我的数据框(df),具有三个变量(发送,重复,案例)
这是我的功能:
my_filter <- function(df, a, b, c){
df <<- df %>%
filter(sent != a,
repeat != b,
!grepl("_v", cases))
}
我希望“ c”参数允许我忽略管道中的最后一行!grepl(“ _ v”,cases)
如何设置“ c”以控制该行的存在/不存在?
答案 0 :(得分:2)
我建议这样的事情:
my_filter = function(df, a, b, c = TRUE) {
result = df %>% filter(
sent != a,
repeat_col != b
)
if(c) result = result %>% filter(!grepl("_v", cases, fixed = TRUE))
return(result)
}
这将按照您的要求处理条件。如果将c
设置为FALSE
,则将不应用最后一个条件。 (在其他情况下,您也可以测试if(missing(c))
来检查c
参数是否由用户提供。)
我也不使用全局赋值,因为您基本上不应该使用全局赋值,return
输入结果可以让用户选择结果名称,而不是为他们选择结果名称并可能覆盖他们已经使用的内容
fixed = TRUE
只是为了提高效率,因为您的模式是完全匹配的,而不是正则表达式。
答案 1 :(得分:0)
这是另一个选择:
library(dplyr)
my_filter <- function(df, a = FALSE, b = FALSE, c = TRUE){
df %>%
filter(Sepal.Width != a,
Sepal.Length != b,
c | !grepl("v", Species))
}
dim(iris %>% my_filter)
#> [1] 150 5
dim(iris %>% my_filter(c=FALSE))
#> [1] 50 5