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,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(其中)我还没有找到时间来围绕让我的头!)
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)
您可以使用one_of(),当列不存在时会发出警告,否则会选择正确的列:
d1 %>%
select(one_of(c("taxon", "model", "z")))
d2 %>%
select(one_of(c("taxon", "model", "z")))
Run Code Online (Sandbox Code Playgroud)
使用内置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)
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |