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) вернуть taxon, model, а также z колонны, а foo(d2) возвращается только taxon а также z,

Если foo содержит select(data,c(taxon,model,z)) затем foo(d2) не удается (потому что d2 не содержит model). Если я использую select(data,-pss) затем foo(d1) терпит неудачу аналогично.

Я знаю, как это сделать, если я отступлю от тидиверса (просто вернусь data[vars]), но мне интересно, есть ли удобный способ сделать это либо (1) с select() какой-то помощник (tidyselect::select_helpers) или (2) с tidyeval (который я до сих пор не нашел времени, чтобы разобраться!)

3 ответа

Решение

Другой вариант select_if:

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

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

Ты можешь использовать one_of(), который выдает предупреждение, когда столбец отсутствует, но в противном случае выбирает правильные столбцы:

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

Использование встроенного 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
Другие вопросы по тегам