我有一个助手函数(比如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)
只返回taxon
和z
。
如果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 (我还没有找到时间思考!)
发布于 2018-07-26 08:18:32
您可以使用one_of()
,它会在缺少列时发出警告,但在其他情况下会选择正确的列:
d1 %>%
select(one_of(c("taxon", "model", "z")))
d2 %>%
select(one_of(c("taxon", "model", "z")))
发布于 2018-07-26 08:44:40
在示例中使用内置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
https://stackoverflow.com/questions/51529294
复制相似问题