Перебрать функцию, которая группирует по переменным столбца - PullRequest
2 голосов
/ 04 октября 2019

У меня есть набор данных со столбцами в форме Bal, Q, W, E, R, T, Y. Я написал функцию, которая позволяет мне суммировать на основе столбца по моему выбору.

BandFunction <- function(x, y){ y <- enquo(y)
    return(x %>%
    group_by(!!y) %>% 
    summarise(Vol=n(),
              Bal = sum(Bal)) %>% 
      mutate(
             'Vol %' = Vol/sum(Vol),
             'Bal %' = Bal/sum(Bal)
      )
    )
    }

Я хочу просмотреть эту функцию, чтобы создать несколько наборов данных. Я пробовал следующее:

Cols <- c("Q", "W", "E","R","T","Y")
ListofDFs <- list()
for(i in 1:length(Col)){
        ListofDFs[[i]] <- BandFunction(df, Cols[i])}
    return(ListofDFs)
        }

Но не работает, так как он будет выдавать data.frames с заголовком столбца с именем Cols[i].

Ответы [ 3 ]

2 голосов
/ 04 октября 2019
Function <- function(x, y){ y <- sym(y)
return(x %>%
         group_by(!!y) %>% 
         summarise(Vol=n(),
                   Bal = sum(Bal)) %>% 
         mutate(
           'Vol %' = Vol/sum(Vol),
           'Bal %' = Bal/sum(Bal)
         )
)
}

df<-data.frame(Vol=seq(1,50,1),Bal=seq(1,100,2),Q=sample(LETTERS,50,replace = T),R=sample(letters,50,replace = T))
Cols <- c("Q", "R")
ListofDFs <- list()
for(i in 1:length(Cols)){
  ListofDFs[[i]] <- Function(df, Cols[i])
}

В коде есть две опечатки: в цикле for Col следует = Cols и в цикле for есть потерянная фигурная скобка.

2 голосов
/ 04 октября 2019

Вот как вы решаете это

Я изменил вашу функцию с помощью {{ y }} (не имеет большого значения, работает и с enquo(y)).

BandFunction <- function(x, y){ 
return(x %>%
         group_by({{y}}) %>% 
         summarise(Vol=n(),
                   Bal = sum(mpg)) %>% 
         mutate(
           'Vol %' = Vol/sum(Vol),
           'Bal %' = Bal/sum(Bal)
         )
)
}

Создать списокпеременных, которые вас волнуют (в вашем случае это QWERTY вектор)

my_vars <- names(mtcars)[2:3]

## check my_vars %>% syms()

my_vars %>%
# The syms command is key to generate a list of columns to loop over
  syms() %>%
# now call and don't forget to use !!var
# otherwise you are asking for the column `var` to get evaluated
  purrr::map(function(var) BandFunction(mtcars, !!var))

Имейте в виду, что я использую mtcars и mpg, чтобы получить воспроизводимый пример. Измените это для ваших целей

Результат -

[[1]]
# A tibble: 3 x 5
    cyl   Vol   Bal `Vol %` `Bal %`
  <dbl> <int> <dbl>   <dbl>   <dbl>
1     4    11  293.   0.344   0.456
2     6     7  138.   0.219   0.215
3     8    14  211.   0.438   0.329

[[2]]
# A tibble: 27 x 5
    disp   Vol   Bal `Vol %` `Bal %`
   <dbl> <int> <dbl>   <dbl>   <dbl>
 1  71.1     1  33.9  0.0312  0.0527
 2  75.7     1  30.4  0.0312  0.0473
 3  78.7     1  32.4  0.0312  0.0504
 4  79       1  27.3  0.0312  0.0425
 5  95.1     1  30.4  0.0312  0.0473
 6 108       1  22.8  0.0312  0.0355
 7 120.      1  21.5  0.0312  0.0334
 8 120.      1  26    0.0312  0.0404
 9 121       1  21.4  0.0312  0.0333
10 141.      1  22.8  0.0312  0.0355
# … with 17 more rows

0 голосов
/ 04 октября 2019

Другой вариант без использования NSE - это использование group_by_at, которое принимает строковые аргументы.

Cols <- c("Q", "W", "E","R","T","Y")
library(dplyr)

purrr::map(Cols, ~df %>%
                   group_by_at(.x) %>% 
                   summarise(Vol=n(),
                             Bal = sum(Bal)) %>% 
                   mutate('Vol %' = Vol/sum(Vol),
                          'Bal %' = Bal/sum(Bal)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...