2012-12-29 61 views
-1

我如何得到聚合結果?如何在聚合中獲得相同的結果?

x=iris[,1:4] 
transform(x,"sum"=apply(x,MARGIN=1,FUN=sum)) 

輸出爲:

Sepal.Length Sepal.Width Petal.Length Petal.Width sum 
1   5.1   3.5   1.4   0.2 10.2 
2   4.9   3.0   1.4   0.2 9.5 
3   4.7   3.2   1.3   0.2 9.4 
4   4.6   3.1   1.5   0.2 9.4 

(多線略),我只是想知道總好,也許就很難得到相同的結果,通過聚合函數適用。

+0

你的意思是相反的,對不對? – Rubens

+2

這沒有任何意義。應用和聚合做完全不同的事情。 – joran

+1

我同意@joran。你應該重新闡述你的問題,以表達你通常想要達到的目標。現在聽起來好像你在問如何將一個方形的釘子安裝到一個圓孔中。如果你只是想避免你對'apply'的調用,另一個選擇是'sum = rowSums(x)'。 –

回答

0

如果魯本斯是正確的,你要使用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) 

編輯補充從迪文的回答修改sapplylapply給予相同的答案tapplyaggregate正上方,以及rapplyvapply和重新格式化tapplyby功能:

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) 
2

您的問題似乎與我預期會遵循的代碼有所不同。 aggregate旨在將「特定」函數應用於列,但僅限於「by」參數劃分的類別中。它被設計爲「在特定類別中聚合。」

apply(其第二個參數設置爲2而不是1,因爲在你的代碼中)將在整列上使用一個函數,沒有分組變量。逐行地處理不同含義和輸入的矢量,因此它返回每個個體四個不同測量值的個體總和,這個過程可能沒有意義,除非已經建立了該過程的一些準備或基礎。

如果你想用類似的方式使用,然後看看這些:

> sapply(split(iris[,1:4], iris[, 5]), apply, 2, sum) 
      setosa versicolor virginica 
Sepal.Length 250.3  296.8  329.4 
Sepal.Width 171.4  138.5  148.7 
Petal.Length 73.1  213.0  277.6 
Petal.Width 12.3  66.3  101.3 


> aggregate(iris[ ,1: 4], iris[5], FUN=sum) 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  250.3  171.4   73.1  12.3 
2 versicolor  296.8  138.5  213.0  66.3 
3 virginica  329.4  148.7  277.6  101.3 

如果你的目標是不要做任何的類別計算,你將通過聚合一個相同的長度數據幀的行數的列表:

> aggregate(iris[ ,1: 4], list(rep(1,nrow(iris))), FUN=sum) 
    Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  1  876.5  458.6  563.7  179.9 
> apply(iris[1:4], 2, sum) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
     876.5  458.6  563.7  179.9 
+0

在我們使用的情況下,以類似於彙總的方式申請,您認爲我們可以更喜歡申請履行理由嗎? – agstudy

+1

'apply.data.frame'通常不會產生很好的性能。我期望使用'sapply'或'lapply'來獲得更好的性能。他們少做班級檢查。如果問題符合這些功能,「colMeans」或「colSums」將會最快。 –

相關問題