R中的ave函数:第一个参数是一个向量

时间:2012-03-30 18:38:23

标签: r average

我正在尝试在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(character)是数据帧d的列,用户需要指定这些列才能获得所需的结果。当我使用函数ave()时,我需要引用这个名称。

2 个答案:

答案 0 :(得分:3)

您需要使用[[按名称获取varcategory列:

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

...因为d$var试图获取名为“var”的列,并且没有。

<强>更新

> 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 :(得分:2)

最好的解决方案是根本不使用名称:

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

然后将其称为

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

你的问题中的函数没有像你想象的那样工作的原因部分是因为R的语法和DWIM - 用于字符串操作糟透了。这是一个使用evalparse

的hacky,脆弱的解决方案
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。