为什么这个简单的ave功能不起作用

时间:2014-10-05 01:56:08

标签: r

我正在使用以下代码和数据:

> 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

为什么会出现错误&#39; unique()仅适用于向量&#39;以及如何在这里使用ave功能?

1 个答案:

答案 0 :(得分:5)

这有点微妙,我认为最好的文档实际上是argument matching上的R语言定义:

  

功能评估中首先发生的是匹配   正式的实际或提供的论点。这是由a完成的   三通过程:

     
      
  1. 标签上的完全匹配。对于每个命名提供的参数列表   搜索形式参数以查找名称完全匹配的项目。   使相同的形式参数匹配几个实际值是错误的   或相反亦然。

  2.   
  3. 标签上的部分匹配。每个剩余的名称提供   将参数与使用partial的剩余正式参数进行比较   匹配。如果提供的参数的名称与之完全匹配   正式论证的第一部分然后是两个论点   被认为是匹配的。有多个部分是错误的   火柴。请注意,如果f&lt; - function(fumble,fooey)fbody,则f(f =   1,fo = 2)是非法的,即使只是第二个实际论点   匹配fooey。 f(f = 1,fooey = 2)从第二个开始是合法的   参数完全匹配,并从部分考虑中删除   匹配。如果形式参数包含'...',那么部分匹配   仅适用于它之前的参数。

  4.   
  5. 位置匹配。任何   无法匹配的形式参数绑定到未命名的提供参数,在   订购。如果有一个'...'参数,它将占用剩余的   参数,标记与否。

  6.   

所以这是参数的特殊性质的结果。从某种意义上说,它是&#34;贪婪的&#34;,除非你更明确并使用命名参数。这不会在其他地方弹出的原因是因为通常是最后(或接近最后)的参数,因此在使用位置匹配时,您通常不会遇到这种混乱的行为。