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

时间:2019-02-28 06:07:05

标签: r filter dplyr

有人问here,并标为重复。但是,它不是重复的,也没有收到答案。我再问一次。

我有

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

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

> 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'来执行以下操作:

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语法。

1 个答案:

答案 0 :(得分:1)

tidy evaluation syntax之后,使用:

df %>% filter(!!sym(col) %in% !!vals)

sym()将您的字符串转换为dplyr可以评估的符号。

还有df %>% filter(!!as.name(col) %in% !!vals)就像@ A.Suliman指出的那样。