R - dplyr 0.4.1: Как суммировать по имени столбца в функции - PullRequest
0 голосов
/ 17 декабря 2018

Мне нужно создать функцию, которая могла бы group_by и суммировать фрейм данных, используя имена его столбцов.Я работаю с dplyr версии 0.4.1 (и не могу обновить), поэтому похоже, что решения, которые я нашел по другим темам, не работают ...

Вот мой пример:

data <- data.frame(section=rep(c("A","B"),3), quantity=c(6:11))
#I need to get this result : 
RESULT = data %>% group_by(section) %>% summarise(total=sum(quantity))

Я реализовал эту функцию, но получил ошибку:

# function : 
synthetize = function(x,column,measure){
  result = x %>% group_by(column) %>% summarise(total=sum(measure))
}
RESULT2=synthetize(data,column="section",measure="quantity")
RESULT2

Я попытался eval, get, но, похоже, это не помогает

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Другой способ - с enquo:

library(tidyverse)

synthetize = function(x,column,measure) {

  result = x %>% group_by(!! enquo(column)) %>% summarise(total := sum(!! enquo(measure)))

}

В этом случае вам не нужно заключать в кавычки переменные:

RESULT2 = synthetize(data, column = section, measure = quantity)

RESULT2

# A tibble: 2 x 2
  section total
  <fct>   <int>
1 A          24
2 B          27

Если у вас нет доступадо новейшего tidyverse, попробуйте с get:

library(dplyr)

synthetize = function(x,column,measure) {

  result = x %>% group_by(get(column)) %>% summarise(total := sum(get(measure)))

}
0 голосов
/ 17 декабря 2018

Мы можем преобразовать строку в символ с помощью rlang::sym и вычислить (!!)

library(tidyverse)
synthetize = function(x, column, measure){
     x %>% 
        group_by_at(column) %>%
        summarise(total=sum(!! rlang::sym(measure)))
   }

synthetize(data, column="section", measure="quantity")
# A tibble: 2 x 2
#  section total
#   <fct>   <int>
#1 A          24
#2 B          27

ПРИМЕЧАНИЕ: Здесь мы используем тот же тип аргумента OP


Еслимы используем более старую версию dplyr, может помочь следующее

library(lazyeval)
synthetize2 = function(x, column, measure){

  x %>% 
     group_by_(column) %>%
     summarise(total = interp(~ sum(v1), v1 = as.name(measure)))


synthetize2(data, column='section', measure='quantity')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...