集合函数中的子集参数

use*_*469 2 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
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)

far*_*nsy 5

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

一种容易犯的错误,所以我了解您是如何到达这里的。

aggregate()不幸的是,您似乎需要对数据进行子集处理。