Dplyr / tidyverse:rename_at` .funs`必须包含一个重命名函数,而不是4

时间:2018-05-16 13:11:34

标签: r dplyr tidyverse

我有以下测试数据:

actions.intent.TRANSACTION_REQUIREMENTS_CHECK

我想写一个函数,用一个均值来总结分组列,我希望我可以得到前缀为“mean _”的结果列

library(tidyverse)

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

如果没有rename_at行,它可以正常工作,但是它会抛出错误:

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_', .))
}

R回复

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

我应该如何有效地为新列名添加前缀?

更小的问题:是否可以避免vars()或引用arount参数  调用函数时的列名?

了解这两件小事将大大增强我的代码,非常感谢大家提前寻求帮助。

2 个答案:

答案 0 :(得分:3)

虽然@docendodiscimus的早期答案更简洁,但是对于它的价值,你的代码有两个问题:

  1. 您需要在paste中包含paste0(更好:funs)功能。
  2. 在重命名之前,您需要ungroup(请参阅例如this post)。
  3. 您的代码的工作版本如下所示:

    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
    

答案 1 :(得分:2)

如果您想采用简单的路线,可以使用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"))