我在aggregate
函数中使用subset
参数得到了意想不到的结果,所以我尝试了以下操作。
> 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
根据帮助文件,subset
参数是类型"formula"的S3方法的一部分,您不使用它。您正在为data.frame
类型使用S3方法。因此,您的subset
参数在...
中向下传递到lapply()
,然后传递到对sum()
的每次调用。因为它是一个包含6个TRUE
值的向量,所以每次求和都会得到6。
这是一个很容易犯的错误,所以我理解你是怎么到这里的。
看起来你将需要你的数据子集之前传递给aggregate()
,不幸的是