我使用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
答案 0 :(得分:4)
根据帮助文件,subset
参数是类型“公式”的S3方法的一部分,您没有使用它。您正在使用类型data.frame
的S3方法。因此,您的subset
参数会在...
传递到lapply()
,然后传递给sum()
。由于它是6个TRUE
值的向量,因此每个求和都会增加6个。
有点容易出错,所以我明白你是怎么来到这里的。
不幸的是,您似乎需要在将数据传递给aggregate()
之前对其进行子集化。