代码之家  ›  专栏  ›  技术社区  ›  abalter

使用动态列名和动态值的Dplyr筛选器

  •  0
  • abalter  · 技术社区  · 7 年前

    有人问了同样的问题 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 回复  |  直到 7 年前
        1
  •  5
  •   Mikko    7 年前

    遵循 tidy evaluation syntax ,使用:

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

    sym() 将字符串转换为dplyr知道如何计算的符号。

    而且 df %>% filter(!!as.name(col) %in% !!vals) 正如@A.Suliman指出的那样。

    推荐文章