1)首先要注意
search_value <- c("setosa", 5.0)
将强制 5.0 转换为字符,所以这是有问题的。而是创建一个数据框,然后使用inner_join。
(如果 search_value 都是字符串而不是字符串和数字的混合,那么就问题中显示的变量而言,我们可以使用注释掉的行,或者我们可以使用 search_cols 代替下面的名称(searchDF)和在其他地方使用 search_value 代替 searchDF。)
# searchDF <- as.data.frame(setNames(as.list(search_value), search_col))
searchDF <- data.frame(Species = "setosa", Sepal.Length = 5.0)
inner_join(iris, searchDF, by = names(searchDF))
给予:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5 3.6 1.4 0.2 setosa
2 5 3.4 1.5 0.2 setosa
3 5 3.0 1.6 0.2 setosa
4 5 3.4 1.6 0.4 setosa
5 5 3.2 1.2 0.2 setosa
6 5 3.5 1.3 0.3 setosa
7 5 3.5 1.6 0.6 setosa
8 5 3.3 1.4 0.2 setosa
2) 如果必须使用filter,则使用cur_data() 引用数据。标量变量可以直接使用。
filter(iris, cur_data()[, names(searchDF)[1]] == searchDF[[1]] &
cur_data()[, names(searchDF)[2]] == searchDF[[2]])
3) 对于任意数量的条件,请使用 reduce(来自 purrr)或 Reduce(来自基础 R)。
library(dplyr)
library(purrr)
myfilter <- function(x, nm) filter(x, cur_data()[, nm] == searchDF[[nm]])
iris %>% reduce(names(searchDF), myfilter, .init = .)