dplyr:在函数内传递列名给 summarize

3

我有以下示例,其中我将一个简单的数据框传递给一个函数以总结一列。我希望将汇总列的名称 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
2个回答

5
如果我们传递一个带引号的参数,那么一种选项是在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="总结列标签")

(注:sumf是一个函数名,无法翻译)

我总是想要对列a进行汇总。然而,包含我想要更改的被汇总变量的列的名称在OP中。 - undefined
@N08 如果你检查一下你的原始代码,它是s="a" - undefined
我编辑了一下,以使得更清楚我想要改变的是汇总列的标签,而不是正在被汇总的变量,我相信这就是你的帖子所展示的(感谢迅速回复)。 - undefined
我觉得我们彼此之间有些混淆。我在原始帖子中更新了两个例子。 - undefined
@N08 更新了我的帖子 - undefined
显示剩余2条评论

0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接