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