dplyr :: select()具有某些可能在数据框中不存在的变量?

时间:2018-07-26 00:08:52

标签: r select dplyr nse tidyselect

我有一个辅助函数(例如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)返回taxonmodelz列,而foo(d2)仅返回{{1} }和taxon

如果z包含foo,则select(data,c(taxon,model,z))失败(因为foo(d2)不包含d2)。如果我使用model,则select(data,-pss)同样会失败。

如果我退出tidyverse(只是返回foo(d1)),我知道该怎么做,但是我想知道是否有一种方便的方法可以通过data[vars]助手来做到这一点(1)某种(select()或(2)与tidyeval(我仍然还没来得及动手!)

3 个答案:

答案 0 :(得分:11)

另一个选项是select_if

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

# # A tibble: 1 x 2
#   taxon     z
#   <dbl> <dbl>
# 1     2     3

答案 1 :(得分:6)

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

d1 %>%
    select(one_of(c("taxon", "model", "z")))
d2 %>%
    select(one_of(c("taxon", "model", "z")))

答案 2 :(得分:4)

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

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