Dplyr / tidyverse: rename_at `.funs` должен содержать одну функцию переименования, а не 4 - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующие тестовые данные:

library(tidyverse)

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(a, a, a, b, b),
  a = sample(5),
  b = sample(5)
)

Я хотел бы написать функцию, которая суммирует сгруппированные столбцы со средним значением, и я хотел бы, чтобы получающиеся столбцы имели префикс «среднее _»

my_summarise1 <- function(df, group_var, summarise_var) {
df %>%
  group_by_at(.vars = group_var) %>%
  summarise_at(.vars = summarise_var, .funs= mean) %>% 
  rename_at(.vars= summarise_var, .funs=paste('mean_', .))
}

Без строки rename_at все работает нормально, но выдает ошибку:

my_summarise1(df, vars(g1,g2),vars(a,b))

R отвечает

 Error: `.funs` must contain one renaming function, not 4 

Как мне эффективно добавлять префиксы к новым именам столбцов?

Меньший вопрос: можно ли избежать vars () или кавычек вокруг параметров имена столбцов при вызове функции?

Знание этих двух небольших вещей значительно улучшило бы мой код, большое спасибо всем заранее за помощь.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Хотя более ранний ответ @docendodiscimus более лаконичен, для вашего кода есть две проблемы:

  1. Вам нужно обернуть функцию paste (лучше: paste0) в funs.
  2. Вам необходимо ungroup до переименования (см., Например, этот пост ).

Рабочая версия вашего кода выглядит следующим образом:

my_summarise1 <- function(df, group_var, summarise_var) {
    df %>%
        group_by_at(group_var) %>%
        summarise_at(summarise_var, mean) %>%
        ungroup() %>%
        rename_at(summarise_var, funs(paste0('mean_', .)))
}

my_summarise1(df, vars(g1, g2), vars(a, b))
## A tibble: 3 x 4
#     g1 g2    mean_a mean_b
#  <dbl> <chr>  <dbl>  <dbl>
#1    1. a       2.50   2.50
#2    2. a       4.00   5.00
#3    2. b       3.00   2.50
0 голосов
/ 16 мая 2018

Если вы хотите выбрать простой маршрут, вы можете использовать способ добавления суффиксов к суммированным столбцам в dplyr:

my_summarise1 <- function(df, group_var, summarise_var) {
  df %>%
    group_by_at(.vars = group_var) %>%
    summarise_at(.vars = summarise_var, funs(mean=mean)) 
}


my_summarise1(df, vars(g1,g2), vars(a,b))

# A tibble: 3 x 4
# Groups:   g1 [?]
     g1 g2    a_mean b_mean
  <dbl> <chr>  <dbl>  <dbl>
1    1. a       3.50   4.50
2    2. a       4.00   1.00
3    2. b       2.00   2.50

В этом случае funs(mean=mean) указывает dplyr использовать суффикс meanи примените функцию mean.Для ясности вы можете использовать funs(mysuffix = mean), чтобы использовать любой другой суффикс и применить функцию mean.


В ответ на вопрос OP вы можете использовать следующую модификацию, которая не требует использованияvars при вызове функции.

my_summarise2 <- function(df, group_var, summarise_var) {
  df %>%
    group_by_at(.vars = group_var) %>%
    summarise_at(.vars = summarise_var, funs(mean=mean))
}

my_summarise2(df, c("g1","g2"), c("a","b"))
...