此处提出了同样的问题并标记为重复。然而,它不是重复的,也没有收到任何答复。我又问了
我有
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 语法。
遵循整洁的评估语法,使用:
df %>% filter(!!sym(col) %in% !!vals)
Run Code Online (Sandbox Code Playgroud)
sym()将您的字符串转换为 dplyr 知道要评估的符号。
也df %>% filter(!!as.name(col) %in% !!vals)正如 @A.Suliman 指出的那样。