【问题标题】:Dplyr filter using dynamic column name and dynamic value使用动态列名和动态值的 Dplyr 过滤器
【发布时间】:2019-07-21 23:55:48
【问题描述】:

同样的问题被问到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 语法。

【问题讨论】:

  • df %&gt;% filter(!!as.name(col) %in% !!vals) 来自已接受答案的评论作品

标签: r filter dplyr


【解决方案1】:

按照tidy evaluation syntax,使用:

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

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

df %&gt;% filter(!!as.name(col) %in% !!vals) 也像 @A.Suliman 指出的那样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    相关资源
    最近更新 更多