dplyr :: select()包含一些可能不存在于数据框中的变量?

Ben*_*ker 12 select r dplyr nse tidyselect

我有一个辅助函数(比如说foo()),它将在各种数据框上运行,这些数据框可能包含也可能不包含指定的变量.假设我有

library(dplyr)
d1 <- data_frame(taxon=1,model=2,z=3)
d2 <- data_frame(taxon=2,pss=4,z=3)
Run Code Online (Sandbox Code Playgroud)

我想要选择的变量是

vars <- intersect(names(data),c("taxon","model","z"))
Run Code Online (Sandbox Code Playgroud)

也就是说,我想foo(d1)返回taxon,modelz列,而foo(d2)回报只是taxonz.

如果foo包含select(data,c(taxon,model,z))foo(d2)失败(因为d2不包含model).如果我使用select(data,-pss)然后foo(d1)同样失败.

我知道如果我退出tidyverse(只是返回data[vars])该怎么做,但我想知道是否有一个方便的方法来做(1)与某种select()帮助(tidyselect::select_helpers)或(2)与tidyeval(其中)我没有找到时间来围绕让我的头!)

mt1*_*022 13

另一种选择是select_if:

d2 %>% select_if(names(.) %in% c('taxon', 'model', 'z'))

# # A tibble: 1 x 2
#   taxon     z
#   <dbl> <dbl>
# 1     2     3
Run Code Online (Sandbox Code Playgroud)

  • 有其他选择总是好的,但是 `select_if(...)` 似乎比 `select(which(...))` 更好 (2认同)

Mar*_*ius 7

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

d1 %>%
    select(one_of(c("taxon", "model", "z")))
d2 %>%
    select(one_of(c("taxon", "model", "z")))
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

使用内置anscombe数据框作为示例,注意其中z不是列anscombe

anscombe %>% select(intersect(names(.), c("x1", "y1", "z")))
Run Code Online (Sandbox Code Playgroud)

给予:

   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
Run Code Online (Sandbox Code Playgroud)