使用动态列名和动态值的Dplyr过滤器 [英] Dplyr filter using dynamic column name and dynamic value

查看:64
本文介绍了使用动态列名和动态值的Dplyr过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此处询问了相同的问题,并将其标记为重复的。但是,它不是重复的,也没有收到答案。我再次询问。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆