聚合函数中的子集参数

时间:2014-08-10 22:36:03

标签: r

我使用subset函数中的aggregate参数获得了意外结果,因此我尝试了以下操作。

 > A <- data.frame( d1=c(1,1,1,2,2,2), d2=c(1,1,2,2,3,3) , n=c(13,24,54,24,12,32) )
 > aggregate( A[,c("n"),drop=FALSE] , A[,c("d1","d2")] , FUN=sum )
   d1 d2  n
 1  1  1 37
 2  1  2 54
 3  2  2 24
 4  2  3 44

确实有意义。

 > aggregate( A[rep(TRUE,6),c("n"),drop=FALSE] , A[rep(TRUE,6),c("d1","d2")] , FUN=sum )
   d1 d2  n
 1  1  1 37
 2  1  2 54
 3  2  2 24
 4  2  3 44

这确实有意义,但却是一种限制观察的复杂方式。

以下不应该返回与上面相同的结果吗?为什么不呢?

 > aggregate( A[,c("n"),drop=FALSE] , A[,c("d1","d2")] , FUN=sum , subset=rep(TRUE,6) )
   d1 d2  n
 1  1  1 43
 2  1  2 60
 3  2  2 30
 4  2  3 50

以防万一是基于索引的子集,我尝试了以下内容,其结果也不直观:

 > aggregate( A[,c("n"),drop=FALSE] , A[,c("d1","d2")] , FUN=sum , subset=1:6 )
   d1 d2  n
 1  1  1 58
 2  1  2 75
 3  2  2 45
 4  2  3 65

1 个答案:

答案 0 :(得分:4)

根据帮助文件,subset参数是类型“公式”的S3方法的一部分,您没有使用它。您正在使用类型data.frame的S3方法。因此,您的subset参数会在...传递到lapply(),然后传递给sum()。由于它是6个TRUE值的向量,因此每个求和都会增加6个。

有点容易出错,所以我明白你是怎么来到这里的。

不幸的是,您似乎需要在将数据传递给aggregate()之前对其进行子集化。