在dplyr中编写范围过滤器函数

时间:2018-01-03 06:35:59

标签: r function dplyr

我正在尝试编写一个使用dplyr的filter_at的函数。我的数据集包括名为pr1:pr15的列(所有chr变量的值如“8201”或“0599”),我正在尝试构建一个过滤器,其中包含在任何col p1中具有值x的任何行:pr15

这是我尝试过的: my_filterfunc <- function(data, x) {data %>% filter_at(vars(starts_with(regex("pr[0:9]"))), any_vars(. == "x"))}

当我尝试运行此函数时: test <- my_fiterfunc(my_tibble, x = "8201")

我收到错误:Error: .predicate has no matching columns 即使我知道有匹配的列

1 个答案:

答案 0 :(得分:2)

我们不需要引用&#39; x&#39;并且使用matches

更容易
my_filterfunc <- function(data, x) {
data %>% 
   filter_at(vars(matches("^pr\\d+")), any_vars(. == x))
 }

my_filterfunc(df1, "8201")
#  ID  pr1  pr2  pr3  pr4  pr5  pr6  pr7  pr8  pr9 pr10
#1  3 8211 8212 8211 8201 8211 8209 8206 8210 8205 8206
#2  5 8210 8204 8205 8203 8204 8201 8215 8215 8201 8206

数据

set.seed(24)
df1 <- data.frame(ID = 1:5, matrix(sample(as.character(8201:8215), 5*10, replace = TRUE),
                 5, 10, dimnames = list(NULL, paste0("pr", 1:10))), stringsAsFactors = FALSE)