使用动态列名和动态值的Dplyr过滤器 [英] Dplyr filter using dynamic column name and dynamic value
问题描述
在此处询问了相同的问题,并将其标记为重复的。但是,它不是重复的,也没有收到答案。我再次询问。
This same question was asked here and marked as a duplicate. However, it is not a duplicate and received no answers. I'm asking again.
我有
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
如果指定列,则可以使用动态值列表,例如:
If I specify the column I can use a dynamic list of values like:
> 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
现在我想要添加 col ='B'
来执行以下操作:
Now I want to add in col='B'
to do something like:
df%>% filter(!!col %in% !!vals)
[1] A B
<0 rows> (or 0-length row.names)
使用
> paste(col, "==", sapply(vals, function(x){paste0("'", x, "'")}), collapse=" | ")
[1] "B == 'TT' | B == 'GG'"
以下怪兽的确起作用:
> 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
我真的希望有一个简单的dplyr-eseq语法。
I'm really hoping there is a simple, dplyr-eseq syntax for this.
推荐答案
遵循整洁的评估语法,使用:
df %>% filter(!!sym(col) %in% !!vals)
sym()
将您的字符串转换为符号,dplyr知道要评估。
sym()
converts your string to a symbol, which dplyr knows to evaluate.
也 df%>%filter(!! as.name(col)%in%!! vals)
就像@ A.Suliman指出的那样。
Also df %>% filter(!!as.name(col) %in% !!vals)
works as @A.Suliman points out.
这篇关于使用动态列名和动态值的Dplyr过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!