summarise_at dplyr多列

时间:2017-10-12 06:55:20

标签: r dplyr

我正在尝试在多个列上应用组后应用复杂函数。

代码示例是:

library(dplyr)
data(iris)

add = function(x,y) {
    z = x+y
    return(mean(z))
}

iris %>%
  group_by(Species) %>%
  summarise_at(.vars=c('Sepal.Length', 'Sepal.Width'), 
           .funs =  add('Sepal.Length', 'Sepal.Width' ) )

我原以为该函数会应用于每个组并作为新列返回但我得到:

Error in x + y : non-numeric argument to binary operator

我怎样才能完成这项工作?

注意我的实际问题比我在这里编写的简单add函数要复杂得多,它需要将两列作为单独的实体输入,我不能先将它们相加。

由于

1 个答案:

答案 0 :(得分:1)

不要认为你需要summarise_at,因为你对add的定义需要注意多个输入参数。将相同的更改应用于多个列时,summarise_at非常有用,而不是将它们组合在一起。

如果您只想要列的总和,可以尝试:

iris %>%
  group_by(Species) %>%
  summarise_at(
    .vars= vars( Sepal.Length, Sepal.Width), 
    .funs =  sum) 

给出:

     Species Sepal.Length Sepal.Width
      <fctr>        <dbl>       <dbl>
1     setosa          250         171
2 versicolor          297         138
3  virginica          329         149

如果您想要将列添加到一起,您可以这样做:

iris %>%
  group_by(Species) %>%
  summarise( k = sum(Sepal.Length, Sepal.Width))

给出:

     Species     k
      <fctr> <dbl>
1     setosa   422
2 versicolor   435
3  virginica   478

将此表单与add

的定义一起使用
add = function(x,y) {
  z = x+y
  return(mean(z))
}


iris %>%
  group_by(Species) %>%
  summarise( k = add(Sepal.Length, Sepal.Width))

返回

     Species     k
      <fctr> <dbl>
1     setosa     8
2 versicolor     9
3  virginica    10