如果 Rubens 是正确的,并且您想使用apply
而不是aggregate
,并且您对与aggregate
今天之前的帖子中相同的表达式感兴趣,那么您可以使用tapply
.
~总之是什么意思?
x=iris[,1:4]
names(x)<-c("x1","x2","x3","x4")
aggregate(x1+x2+x3+x4~x1,FUN=sum,data=x)
tapply((x$x1 + x$x2 + x$x3 + x$x4), x$x1, sum)
编辑以添加sapply
和lapply
修改 DWin 的答案,以给出与上面相同的答案tapply
,
aggregate
以及rapply
,vapply
和重新格式化tapply
的by
函数:
with(x, sapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, lapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, rapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, tapply( (x1 + x2 + x3 + x4), x1 , sum))
with(x, vapply(split((x1 + x2 + x3 + x4), x1), sum, FUN.VALUE=1))
with(x, by((x1 + x2 + x3 + x4), x1, sum))
我还没有想出如何得到相同的答案mapply
。好吧,这是一种方法,但它非常愚蠢:
tapply(mapply(sum, x$x1 , x$x2 , x$x3 , x$x4), x$x1, sum)
最后,这是一种使用apply
(inside tapply
) 获得与上面其他行给出的相同答案的方法:
tapply(apply((x[,1:4]),1,sum),x$x1,sum)
最后一件事,如果您确实想aggregate
返回与帖子中声明相同的答案apply
,这是可能的。但是,您所做的只是将每个单独的行与您的apply
语句相加。因此,您将不得不“欺骗”aggregate
认为 Iris 数据集中的每一行都有一个单独的组,如下所示:
x=iris[,1:4]
names(x)<-c("x1","x2","x3","x4")
apply.sums <- transform(x,"sum"=apply(x,MARGIN=1,FUN=sum))
my.factor <- seq(1, nrow(x))
ag.sums <- aggregate(x1+x2+x3+x4~my.factor,FUN=sum,data=x)
round(ag.sums[,2],2) == round(apply.sums[,5],2)