2012-03-30 113 views
0

我嘗試使用R中下面的代碼:AVE功能:第一個參數向量

ID=seq(1,11) 
g=c(1,2,3,1,1,2,3,4,4,1,3) 
x <- sample(11) 
d <- data.frame(ID,g, x) 

Ranking_Categoria<-function(d,var,category) 
{ 
    d$rank<-ave(d$var,d$category,FUN=rank) 
    return(d) 
} 

,我得到了以下錯誤消息:

Error in split.default(x, g) : first argument must be a vector. 

變量var和類別(字符)是用戶需要指定的數據幀列,以獲得所需的結果。正如你所看到的,當我使用功能ave()時,我需要引用這個名字。

+0

你的麻煩不是'大道',但不知道如何傳遞參數 – 2012-03-30 19:26:40

+0

@卡爾森你是對的!謝謝你的幫助! – Nestorghh 2012-04-02 03:09:28

回答

3

您需要使用[[通過名稱來獲得varcategory列:

Ranking_Categoria<-function(d,var,category) 
{ 
    d$rank<-ave(d[[var]],d[[category]],FUN=rank) 
    return(d) 
} 

...因爲d$var試圖獲得所謂的「變種」之列,並且是沒有的。

UPDATE

> Ranking_Categoria(d, "x", "g") 
    ID g x rank 
1 1 1 10 3 
2 2 2 9 2 
3 3 3 4 1 
4 4 1 11 4 
5 5 1 1 1 
6 6 2 8 1 
7 7 3 6 2 
8 8 4 2 1 
9 9 4 5 2 
10 10 1 3 2 
11 11 3 7 3 
+1

試着運行它作爲'> Ranking_Categoria(d,「x」,「g」)'。 – 2012-03-30 19:20:22

+0

@GregSnow - 好的,我做了,並添加了輸出來回答。 – Tommy 2012-03-30 19:48:18

2

最好的解決辦法是完全不使用名稱:

Ranking_Categoria<-function(d,var,category) 
{ 
    d$rank<-ave(var,category,FUN=rank) 
    return(d) 
} 

然後把它作爲

Ranking_Categoria(d,d$x,d$g) 

之所以功能你的問題不起作用,因爲你認爲這將部分是因爲R的yntax和DWIM用於字符串處理的性能。下面是使用evalparse哈克,脆弱的解決方案:

Ranking_Categoria<-function(d,var,category) 
{ 
    string=paste('d$rank<-ave(d$',var,',d$',category,',FUN=rank)',sep="") 
    eval(parse(text=string)) 
    return(d) 
} 

但是,你還是要稱呼其爲

Ranking_Categoria(d,"x","g") 

而且如果你已經有對象與xg的名字,便可以上帝幫助你,如果你試圖做Ranking_Categoria(d,x,g) ...這就是爲什麼我已經從使用Perl和R平等地堅持Perl(我的第一個和本地編程語言),並只在必要時使用R。

+0

不是不應該在函數中使用「$」,而是「$」是「[[」,不需要引用,因此不會被評估。同樣的事情發生在功能之外。 – 2012-03-30 19:22:18

+0

(對於任何正在傾聽的人,Greg知道比我所知道更多的R/S。)「$」不能用於接受傳遞給函數的參數。它的使用僅限於訪問固定名稱。對於新手來說,更容易記住'obj [[name]]'將起作用,並且obj $ name在使用內部函數時通常會失敗。 – 2012-03-30 19:36:14

+0

@GregSnow - 是的,這就是我在我的回答中試圖說的。 '$'有另一個很危險的怪癖:它有部分匹配! – Tommy 2012-03-30 19:50:07