【问题标题】:Dplyr/tidyverse: rename_at `.funs` must contain one renaming function, not 4Dplyr/tidyverse:rename_at `.funs` 必须包含一个重命名函数,而不是 4 个
【发布时间】:2018-10-26 13:37:57
【问题描述】:

我有以下测试数据:

library(tidyverse)

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

我想编写一个函数,用平均值汇总分组列,我希望我可以让结果列以“mean_”为前缀

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() 或在参数周围加引号 调用函数时的列名?

知道这两个小东西会大大增强我的代码,在此先感谢大家的帮助。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    如果你想走简单的路线,可以使用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 函数。


    Re 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"))
    

    【讨论】:

    • 非常感谢,我希望我能接受两个答案。顺便说一句,您认为可以避免在参数中使用 vars(g1,g2) 并且可以在函数中以某种方式完成吗?
    • 谢谢。我对 var 类型、类......现在看起来更清晰了。
    【解决方案2】:

    虽然@docendodiscimus 之前的回答更简洁,但就其价值而言,您的代码存在两个问题:

    1. 您需要将paste(更好的是:paste0)函数包装在funs 中。
    2. 您需要在重命名之前ungroup(参见例如this post)。

    您的代码的工作版本如下所示:

    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
    

    【讨论】:

    • 非常感谢。请原谅我与上述同事一样的小询问:,您是否认为可以避免在参数中使用 vars(g1,g2) 并且可以在函数中以某种方式完成 vars() ?所以输入将只是 c(g1, g2)。
    • @JacekKotowski 我真的无法添加任何 docendodiscimus 的编辑。我同意将 vars 语句移动到函数中,然后使用例如调用 my_summarise1 c("g1","g2") 让它稍微干净一些。
    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2023-01-09
    • 2023-01-01
    相关资源
    最近更新 更多