我正在尝试在多个列上应用组后应用复杂函数。
代码示例是:
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
函数要复杂得多,它需要将两列作为单独的实体输入,我不能先将它们相加。
由于
答案 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