AVE функция в R: первый аргумент вектор - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь использовать следующий код в R:

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 и category (символ) являются столбцамикадра данных d, который пользователь должен указать, чтобы получить желаемый результат.Мне нужно обращаться к этим именам, когда я использую функцию ave(), как вы можете видеть.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Вам нужно использовать [[, чтобы получить столбцы var и category по имени:

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

... потому что d$var пытается получить столбец с именем "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
2 голосов
/ 30 марта 2012

Лучшим решением было бы вообще не использовать имена:

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

Тогда назовите это как

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

Причина, по которой функция в вашем вопросе не сработала так, как вы думали, отчасти связана с тем, что синтаксис R и DWIM -несс для работы со строками отстой . Вот хакерское, хрупкое решение с использованием eval и parse:

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

И если у вас уже есть объекты с именами x и g, тогда, возможно, боги помогут вам, если вы попытаетесь сделать Ranking_Categoria(d,x,g) ... Вот дерьмо, вот почему я отказался от использования Perl и R в равной степени придерживаться Perl (мой первый и родной язык программирования) и использовать R только при необходимости.

...