代码之家  ›  专栏  ›  技术社区  ›  Ben Bolker

dplyr::select()中是否包含数据帧中可能不存在的某些变量?

  •  10
  • Ben Bolker  · 技术社区  · 6 年前

    我有一个助手功能(比如 foo() )它将在可能包含或不包含指定变量的各种数据帧上运行。假设我有

    library(dplyr)
    d1 <- data_frame(taxon=1,model=2,z=3)
    d2 <- data_frame(taxon=2,pss=4,z=3)
    

    我要选择的变量是

    vars <- intersect(names(data),c("taxon","model","z"))
    

    也就是说,我想 foo(d1) 归还 taxon , model z 列,而 foo(d2) 只是回报 分类单位 Z .

    如果 foo 包含 select(data,c(taxon,model,z)) 然后 FO(D2) 失败(因为) d2 不包含 模型 )如果我使用 select(data,-pss) 然后 FO(D1) 同样失败。

    我知道如果我从《潮歌》中退后该怎么做(就回来吧) data[vars] ,但是我想知道是否有一种简便的方法可以用 select() 某种帮助者( tidyselect::select_helpers )或(2)使用tidyeval 仍然 还没有时间让我清醒过来!)

    3 回复  |  直到 6 年前
        1
  •  11
  •   mt1022    6 年前

    另一个选择是 select_if :

    d2 %>% select_if(names(.) %in% c('taxon', 'model', 'z'))
    
    # # A tibble: 1 x 2
    #   taxon     z
    #   <dbl> <dbl>
    # 1     2     3
    
        2
  •  6
  •   Marius    6 年前

    你可以使用 one_of() ,当列不存在时发出警告,否则选择正确的列:

    d1 %>%
        select(one_of(c("taxon", "model", "z")))
    d2 %>%
        select(one_of(c("taxon", "model", "z")))
    
        3
  •  4
  •   G. Grothendieck    6 年前

    使用内置 anscombe 示例的数据框架,注意 z 不是中的列 安斯科姆 :

    anscombe %>% select(intersect(names(.), c("x1", "y1", "z")))
    

    给:

       x1    y1
    1  10  8.04
    2   8  6.95
    3  13  7.58
    4   9  8.81
    5  11  8.33
    6  14  9.96
    7   6  7.24
    8   4  4.26
    9  12 10.84
    10  7  4.82
    11  5  5.68