使用动态列名称和动态值的 Dplyr 过滤器

aba*_*ter 7 r filter dplyr

此处提出了同样的问题并标记为重复。然而,它不是重复的,也没有收到任何答复。我又问了

我有

df = data.frame(A=1:10, B=sample(c('TT', 'TG', 'GG'), 10, replace=T))
# df
#    A  B
#1   1 TG
#2   2 TG
#3   3 GG
#4   4 TT
#5   5 TT
#6   6 TT
#7   7 GG
#8   8 TT
#9   9 TG
#10 10 TT

Run Code Online (Sandbox Code Playgroud)

如果我指定列,我可以使用动态值列表,例如:

> vals=c('TT', 'GG')
> df%>% filter(B %in% !!vals)
   A  B
1  3 GG
2  4 TT
3  5 TT
4  6 TT
5  7 GG
6  8 TT
7 10 TT
Run Code Online (Sandbox Code Playgroud)

现在我想添加col='B'来做类似的事情:

df%>% filter(!!col %in% !!vals)
[1] A B
<0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

使用

> paste(col, "==", sapply(vals, function(x){paste0("'", x, "'")}), collapse=" | ")
[1] "B == 'TT' | B == 'GG'"
Run Code Online (Sandbox Code Playgroud)

下面的怪物确实有效:

> df %>% filter_(paste(col, "==", sapply(vals, function(x){paste0("'", x, "'")}), collapse=" | "))
   A  B
1  3 GG
2  4 TT
3  5 TT
4  6 TT
5  7 GG
6  8 TT
7 10 TT
Run Code Online (Sandbox Code Playgroud)

我真的希望有一个简单的 dplyr-eseq 语法。

Mik*_*kko 8

遵循整洁的评估语法,使用:

df %>% filter(!!sym(col) %in% !!vals)
Run Code Online (Sandbox Code Playgroud)

sym()将您的字符串转换为 dplyr 知道要评估的符号。

df %>% filter(!!as.name(col) %in% !!vals)正如 @A.Suliman 指出的那样。