当列名(要过滤)和值位于向量中时,在 R 中过滤 tibble?

cod*_*ird 0 r dplyr tidyverse

这可能是一个深奥的问题或用例,但是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方法来使用向量进行过滤,或者我是否愿意使用某些循环将其分解为单独的向量,每个向量的长度为一?

MrF*_*ick 5

使用变量和值,您可以将它们转换为过滤表达式。这里我们使用基础 RMapbquote函数

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)