我正在尝试在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()
时,我需要引用这个名称。
答案 0 :(得分:3)
您需要使用[[
按名称获取var
和category
列:
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 - 用于字符串操作糟透了。这是一个使用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。