我有一个辅助函数(例如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)
仅返回{{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(我仍然还没来得及动手!)
答案 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