2014-10-05 20 views
2

爲什麼我使用下面的代碼和數據這個簡單的AVE功能無法正常工作

> d <- data.frame(year = rep(2000:2002, each = 3), count = round(runif(9, 0, 20))) 
> d 
    year count 
1 2000  1 
2 2000  4 
3 2000  4 
4 2001 14 
5 2001  8 
6 2001 15 
7 2002 10 
8 2002 14 
9 2002 20 
> 
> with(d, ave(count, year, sum)) 
Error in unique.default(x) : unique() applies only to vectors 

我想:

> with(d, ave(count, list(year), sum)) 
Error in unique.default(x) : unique() applies only to vectors 
> with(d, ave(count, list('year'), sum)) 
Error in unique.default(x) : unique() applies only to vectors 
> 
> with(d, ave(count, 'year', sum)) 
Error in unique.default(x) : unique() applies only to vectors 

> with(d, ave('count', 'year', sum)) 
Error in unique.default(x) : unique() applies only to vectors 
> ave(d$count, d$year, sum) 
Error in unique.default(x) : unique() applies only to vectors 

> ave(d$count, factor(d$year), sum) 
Error in unique.default(x) : unique() applies only to vectors 

> ave(d$count, unique(d$year), sum) 
Error in unique.default(x) : unique() applies only to vectors 

> ave(d$count, factor(unique(d$year)), sum) 
Error in unique.default(x) : unique() applies only to vectors 
> ave(d$count, as.factor(unique(d$year)), sum) 
Error in unique.default(x) : unique() applies only to vectors 

以下工作:

> unique(d$count) 
[1] 1 4 14 8 15 10 20 
> unique(d$year) 
[1] 2000 2001 2002 

tapply,骨料和通過工作:

> with(d, tapply(count, year, mean)) 
    2000  2001  2002 
3.00000 12.33333 14.66667 

> with(d, aggregate(count, list(year), mean)) 
    Group.1  x 
1 2000 3.00000 
2 2001 12.33333 
3 2002 14.66667 

> with(d, by(count, year, mean)) 
year: 2000 
[1] 3 
------------------------------------------------------------------------------------------------- 
year: 2001 
[1] 12.33333 
------------------------------------------------------------------------------------------------- 
year: 2002 
[1] 14.66667 

爲什麼有錯誤'unique()僅適用於向量',我如何在這裏使用ave函數?

+0

這是一種微妙的,但嘗試再次嘗試第一次嘗試,但與明確的FUN = sum – joran 2014-10-05 02:08:07

+0

與(d,ave(count,list(year),FUN = sum))起作用。謝謝。爲什麼在'tapply','aggregate'和'by'時它不會假設它是一個函數呢? – rnso 2014-10-05 02:14:07

回答

4

這是一個有點微妙的,我認爲對此最好的文檔實際上是在argument matching R語言定義:

發生在一個功能評價的第一件事是正式匹配 到實際或提供的參數。這是通過三個步驟完成的 :

  1. 標籤上的精確匹配。對於每個提供的參數,將搜索 形式參數列表以查找名稱完全匹配的項目。 具有相同的正式參數匹配多個實際值 或反之亦然,這是錯誤的。

  2. 標籤上的部分匹配。將其餘提供的 參數與使用部分 匹配的其餘正式參數進行比較。如果提供的參數名稱與 正式參數的第一部分完全匹配,那麼兩個參數 被認爲是匹配的。有多個部分 匹配是錯誤的。注意,如果函數(fumble,fooey)是fbody,那麼f(f = 1,fo = 2)是非法的,即使第二個實際參數只有 與fooey匹配。 f(f = 1,fooey = 2)雖然自第二個 參數完全匹配並且從部分 匹配的考慮中移除,但它是合法的。如果形式參數包含'...',那麼部分匹配 僅適用於其前面的參數。

  3. 位置匹配。任何 不匹配的形式參數都綁定到未命名的參數,按 的順序排列。如果有'...'參數,它將佔用剩下的 參數,標記或不標記。

所以這是的參數的特殊性造成的。從某種意義上說,它是「貪婪的」,除非你更明確地使用了命名參數。這不會在其他地方彈出的原因是因爲通常是最後一個(或幾乎最後一個)參數,因此在使用位置匹配時,您不會經常遇到這種令人困惑的行爲。

相關問題