使用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
Run Code Online (Sandbox Code Playgroud)
确实有道理。
> 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
Run Code Online (Sandbox Code Playgroud)
这确实是有道理的,但却是限制观察的复杂方法。
以下内容是否应返回与上述相同的结果?为什么不呢?
> 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
Run Code Online (Sandbox Code Playgroud)
万一子集是基于索引的,我尝试了以下操作,其结果也不直观:
> 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
Run Code Online (Sandbox Code Playgroud)
根据帮助文件,该subset参数是S3方法中“公式”类型的一部分,您没有使用该参数。您将S3方法用于type data.frame。subset因此,您的论据将在to的每个调用中传递,然后传递...到lapply()to的每个调用sum()。由于它是6个TRUE值的向量,因此每个求和都将添加6。
一种容易犯的错误,所以我了解您是如何到达这里的。
aggregate()不幸的是,您似乎需要对数据进行子集处理。