Передача строки в качестве аргумента в R - PullRequest
0 голосов
/ 24 февраля 2019

На довольно регулярной основе я хочу передать строки, которые функционируют как аргументы в коде.Для контекста я часто хочу раздел, в котором я могу передать критерии или предположения фильтрации, которые затем проходят через мой анализ, графики и т. Д., Чтобы сделать его более интерактивным.

Ниже приведен простой пример.Я видел решение eval / parse, но кажется, что это делает фрагменты кода нечитаемыми.Есть ли лучший / чище / короче способ сделать это?

column.names <- c("group1", "group2") #two column names I want to be able to toggle between for grouping
select.column <- group.options[1] #Select the column for grouping

DataTable.summary <- 
  DataTable %>% 
  group_by(select.column) %>% #How do I pass that selection in here? 
  summarize(avg.price = mean(SALES.PRICE))

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать функцию group_by_ для примера в вашем вопросе:

library(dplyr)

x <- data.frame(group1 = letters[1:4], group2 = LETTERS[1:4], value = 1:4)
select.colums <- c("group1", "group2")

x %>% group_by_(select.colums[2]) %>% summarize(avg = mean(value))
# A tibble: 4 x 2
#  group2   avg
#  <fct>  <dbl>
# 1 A          1
# 2 B          2
# 3 C          3
# 4 D          4

Функции семейства *_ в dplyr также могут предложить более общее решение, которое вам нужно, хотя документация по dplyrговорит, что они устарели (?group_by_) и могут исчезнуть в какой-то момент.Выражение, аналогичное приведенному выше решению с использованием синтаксиса вычисления tidy, выглядит следующим образом:

x %>% group_by(!!sym(select.colums[2])) %>% summarize(avg = mean(value))

И для нескольких столбцов:

x %>% group_by(!!!syms(select.colums)) %>% summarize(avg = mean(value))

Это создает символ из строки, который оценивается dplyr.

0 голосов
/ 25 февраля 2019

Я рекомендую использовать group_by_at().Он поддерживает как одиночные строки, так и символьные векторы:

nms <- c("cyl", "am")

mtcars %>% group_by_at(nms)
0 голосов
/ 24 февраля 2019

Ну, это всего лишь копия-вставка с сайта Tidyverse: ссылка: (https://dplyr.tidyverse.org/articles/programming.html#programming-recipes).

my_summarise <- function(df, group_var) {
  group_var <- enquo(group_var)
  print(group_var)
  df %>%
    group_by(!! group_var) %>%
    summarise(a = mean(a))
}
my_summarise(df, g1)
#> <quosure>
#> expr: ^g1
#> env:  global
#> # A tibble: 2 x 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1  2.5 
#> 2     2  3.33

Но я думаю, что я иллюстрирую вашу проблему. Я думаю, что вы действительно хотите сделатьпохоже на приведенный выше код, т.е. создайте функцию.

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