Передать несколько столбцов в dataframe в функцию одновременно в R - PullRequest
0 голосов
/ 17 ноября 2018

После долгих поисков я не могу понять это. Попытка написать функцию, которая:

  • принимает фрейм данных, дБ
  • группирует фрейм данных по var1
  • возвращает среднее значение и sd по группе в нескольких разных столбцах

Вот моя функция,

myfun <- function(db,var1, ...) {

  var1 <- enquo(var1)
  var2 <- quos(...)

  for (i in var2) {

  db %>% 
    group_by(!!var1) %>%       
    summarise(mean_var = mean(!!!var2))

}}

когда я передаю следующее, ничего не возвращается

myfun(data, group, age, bmi)

В идеале я хотел бы сгруппировать возраст и bmi по группам и вернуть среднее значение и sd для каждого. В будущем я хотел бы передать еще много столбцов из данных в функцию ...

Вывод будет аналогичен summaryBy из пакета doby, но сразу для нескольких столбцов и будет выглядеть следующим образом:

Group   age.mean    age.sd
0
1
        bmi.mean    bmi.sd
0
1

1 Ответ

0 голосов
/ 17 ноября 2018

Ваш цикл кажется ненужным (вы ничего не делаете с i).Вместо этого вы можете использовать summarize_at для достижения желаемого эффекта:

myfun <- function(db,var1, ...) {

  var1 <- enquo(var1)
  var2 <- quos(...)

    db %>% 
      group_by(!!var1) %>%       
      summarise_at(vars(!!!var2), c(mean = mean, sd = sd))

  }

И если мы протестируем его с набором данных diamonds:

myfun(diamonds, cut, x, z)

  cut       x_mean z_mean  x_sd  z_sd
  <ord>      <dbl>  <dbl> <dbl> <dbl>
1 Fair        6.25   3.98 0.964 0.652
2 Good        5.84   3.64 1.06  0.655
3 Very Good   5.74   3.56 1.10  0.730
4 Premium     5.97   3.65 1.19  0.731
5 Ideal       5.51   3.40 1.06  0.658

Чтобы приблизить форматирование кВы имели в виду в своем первоначальном посте, мы можем использовать немного тидир магия:

myfun <- function(db,var1, ...) {

  var1 <- enquo(var1)
  var2 <- quos(...)

  db %>% 
    group_by(!!var1) %>%       
    summarise_at(vars(!!!var2), c(mean = mean, sd = sd)) %>% 
    gather(variable, value, -(!!var1)) %>% 
    separate(variable, c('variable', 'measure'), sep = '_') %>% 
    spread(measure, value) %>% 
    arrange(variable, !!var1)

}

   cut       variable  mean    sd
   <ord>     <chr>    <dbl> <dbl>
 1 Fair      x         6.25 0.964
 2 Good      x         5.84 1.06 
 3 Very Good x         5.74 1.10 
 4 Premium   x         5.97 1.19 
 5 Ideal     x         5.51 1.06 
 6 Fair      z         3.98 0.652
 7 Good      z         3.64 0.655
 8 Very Good z         3.56 0.730
 9 Premium   z         3.65 0.731
10 Ideal     z         3.40 0.658
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...