web-dev-qa-db-ja.com

データフレームに存在しない可能性のあるいくつかの変数を持つdplyr :: select()?

指定された変数が含まれる場合と含まれない場合があるさまざまなデータフレームで実行されるヘルパー関数(たとえば、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)taxonmodel、およびz列を返し、foo(d2)がちょうどを返すようにしたいのです。 taxonおよびz

fooselect(data,c(taxon,model,z))が含まれている場合、foo(d2)は失敗します(_d2_にmodelが含まれていないため)。 select(data,-pss)を使用すると、foo(d1)も同様に失敗します。

Tidyverseから撤退した場合(_data[vars]_を返すだけ)にこれを行う方法は知っていますが、(1)select()ヘルパーを使用してこれを行う便利な方法があるかどうか疑問に思っています。ある種の(_tidyselect::select_helpers_)または(2)tidyevalを使用(これはまだ頭を動かす時間がありません!)

16
Ben Bolker

別のオプションはselect_if

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

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

one_of()を使用できます。これは、列が存在しない場合に警告を表示しますが、それ以外の場合は正しい列を選択します。

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

組み込みのanscombeデータフレームを使用して、zanscombeの列ではないことに注意してください。

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
5
G. Grothendieck