【问题标题】:dplyr: passing column name to summarize inside functiondplyr:传递列名来汇总内部函数
【发布时间】:2018-03-07 22:18:50
【问题描述】:

我有以下示例,其中我将一个简单的数据框传递给一个汇总列的函数。汇总列的名称,s,我想将其作为函数的参数:

df <- data.frame(id = c(1,1,1,1,1,2,2,2,2,2),
                 a=c(1:10),
                 b=c(10:19))

sum <- function(df, s){
  df <- df %>% 
    group_by(id) %>%
    summarize(s = sum(a))
  return(df)
}

sum(df = df, s = "summarizing.column.label")

但是,无论我设置的值如何,汇总列总是得到相同的名称s。有办法改吗?


编辑:我想要的输出是:

sum(df = df, s = "summarizing.column.label")

         id     summarizing.column.label
      <dbl> <int>
    1  1.00    15
    2  2.00    40

sum(df = df, s = "a")

         id     a
      <dbl> <int>
    1  1.00    15
    2  2.00    40

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    如果我们传递一个带引号的参数,那么一个选项是在summarise 之后,我们使用rename_at

    sumf <- function(df, s){
    
    df %>% 
        group_by(id) %>%
        summarize(a = sum(a))%>%
         rename_at("a", ~ s) 
    
    
     }
    
    sumf(df, s  ="summarizing.column.label" )
    # A tibble: 2 x 2
    #     id summarizing.column.label
    #  <dbl>                    <int>
    #1  1.00                       15
    #2  2.00                       40
    
    sumf(df, s  ="a" )
    # A tibble: 2 x 2
    #     id     a
    #   <dbl> <int>
    #1  1.00    15
    #2  2.00    40
    

    或者另一种选择是使用:=!!

    sumf <- function(df, s){
    
      df %>% 
         group_by(id) %>%
         summarize(a = sum(a))%>%
         rename(!! (s) := a)
    }
    
    sumf(df, s  ="summarizing.column.label" )
    # A tibble: 2 x 2
    #     id summarizing.column.label
    #  <dbl>                    <int>
    #1  1.00                       15
    #2  2.00                       40
    

    或在summarise

    sumf <- function(df, s){
    
     df %>% 
       group_by(id) %>%
        summarise(!!(s) :=  sum(a))
    }
    

    sumf(df, s ="summarizing.column.label" )

    【讨论】:

    • 我一直想总结a这个专栏。但是,包含我想在 OP 中更改的汇总变量的列的 name
    • @N08 如果你检查你的原始代码,它是s="a"
    • 我对其进行了编辑以使其更清楚地表明它是我要更改的汇总列的标签,而不是正在汇总的变量,我认为这是您的帖子所显示的(感谢您的快速回复)
    • @N08 你是说你对summarise's'的论点不再感兴趣了?
    • 我认为我们互相混淆了。我用两个例子更新了 OP
    【解决方案2】:

    试试这个:

    sum <- function(df, s){
      df <- df %>% 
        group_by(id) %>%
        summarize(!!s := sum(a))
      return(df)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多