这可能是一个深奥的问题或用例,但是filter当列名和值位于向量内部时,是否有快速获取 tibble 的方法?
假设我想过滤mpg和。我可以做类似的事情:hpmtcars
filter(mtcars, mpg >= 15 & hp >= 100)
Run Code Online (Sandbox Code Playgroud)
相反,假设我有几种过滤情况——其中要在一个向量中过滤列,而在另一个向量中过滤值。(实际上,我可能在一个较大的 df 中有四到五个案例。)
car_stat <- c('mpg', 'hp')
car_value <- c(15, 100)
Run Code Online (Sandbox Code Playgroud)
显然这是行不通的。
filter(mtcars, car_stat >= car_value)
Run Code Online (Sandbox Code Playgroud)
但是是否有一些简洁的dplyr/tidyverse方法来使用向量进行过滤,或者我是否愿意使用某些循环将其分解为单独的向量,每个向量的长度为一?
使用变量和值,您可以将它们转换为过滤表达式。这里我们使用基础 RMap和bquote函数
car_stat <- c('mpg', 'hp')
car_value <- c(15, 100)
criteria <- unname(Map(function(c, v) bquote(.(as.name(c))>=.(v)), car_stat, car_value))
criteria
# [[1]]
# mpg >= 15
#
# [[2]]
# hp >= 100
Run Code Online (Sandbox Code Playgroud)
这将创建您想要用于过滤器的表达式列表。然后你可以将它们filter注入!!!
dplyr::filter(mtcars, !!!criteria)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# ...
Run Code Online (Sandbox Code Playgroud)