如果魯本斯是正確的,你要使用apply
而不是aggregate
,並且您有興趣使用與您之前的今日發帖相同的aggregate
表達式,那麼您可以使用tapply
。
What is the meaning of ~ in aggregate?
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
給予相同的答案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
(內tapply
)得到相同的答案由其他線路上面給出的方式:
tapply(apply((x[,1:4]),1,sum),x$x1,sum)
最後一件事,如果您確實希望aggregate
返回與您帖子中的apply
聲明相同的答案,則可以。但是,您所做的只是用您的apply
聲明對每個單獨的行進行求和。因此,你將不得不「絕招」 aggregate
到思維有一組像這樣在虹膜數據每行一個單獨的組:
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)
你的意思是相反的,對不對? – Rubens
這沒有任何意義。應用和聚合做完全不同的事情。 – joran
我同意@joran。你應該重新闡述你的問題,以表達你通常想要達到的目標。現在聽起來好像你在問如何將一個方形的釘子安裝到一個圓孔中。如果你只是想避免你對'apply'的調用,另一個選擇是'sum = rowSums(x)'。 –