Использование переменной для выбора нескольких столбцов в select (dplyr) - PullRequest
0 голосов
/ 06 апреля 2020

С dplyr, когда я хочу выбрать несколько столбцов в диапазоне, я обычно могу сделать что-то вроде этого:

dplyr::select(data, column1:column7)

Однако я пишу функцию, где пользователь будет вводить имена столбцов как переменная, например:

colnames <- "column1:column7"

Очевидно, это не сработает:

dplyr::select(data,  colnames)

Но что будет?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Если это возможно, вы можете принять два отдельных ввода от пользователя. Затем мы можем сгенерировать последовательность номеров столбцов между ними, используя match.

Например, используя базу R с mtcars набором данных

col1 <- 'mpg'
col2 <- 'am'
mtcars[match(col1, names(mtcars)) : match(col2, names(mtcars))]

#                     mpg cyl  disp  hp drat    wt  qsec vs am
#Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1
#Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0
#...

Если у вас нет отдельного входа, вы можете разделить комбинированный вход на ":".

col <- 'mpg:am'
col <- strsplit(col, ":")[[1]]

и теперь вы можете использовать col[1] в качестве col1 и col[2] в качестве col2 в вышеуказанном методе.

mtcars[match(col[1], names(mtcars)) : match(col[2], names(mtcars))]
0 голосов
/ 06 апреля 2020

Вы можете использовать select_at, но строка поиска у вас не стандартная. Так что вам придется поработать над этим.

library(dplyr)
library(rlang)
library(purrr)
colnames <- map2("column",1:7,paste0) %>% unlist
data <- as.data.frame(matrix(0,ncol=7,nrow=2))
colnames(data) <- colnames
select_at(data,colnames)
#  column1 column2 column3 column4 column5 column6 column7
#1       0       0       0       0       0       0       0
#2       0       0       0       0       0       0       0

Здесь я использую purrr и rlang для удобства. Вы также можете использовать базовые функции R

searchstring <- "column1:column7"
replacedstring <- gsub("column","",searchstring)
sequence <- eval_tidy(parse_expr(replacedstring))
parsedcolumns <- map_chr(sequence,~ paste0("column",.x))
select_at(data,parsedcolumns)
  column1 column2 column3 column4 column5 column6 column7
1       0       0       0       0       0       0       0
2       0       0       0       0       0       0       0

Обратите внимание, что оценка произвольного кода, предоставленного пользователями, опасна. Я бы порекомендовал найти другой способ ввода данных пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...