【问题标题】:Using aggregate() on data.frame objects在 data.frame 对象上使用 aggregate()
【发布时间】:2015-04-27 19:06:41
【问题描述】:

为什么 aggregate() 在这里不起作用?

> aggregate(cbind(var1 = 1:10, var2 = 101:110), 
      by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
      FUN = function(x) 
        { 
        c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=dev(x[, "var2"])) 
        })

Error in x[, "var2"] (from #1) : incorrect number of dimensions

> cbind(var1 = 1:10, var2 = 101:110)[, "var2"]
 [1] 101 102 103 104 105 106 107 108 109 110

更新

运行正确版本后返回的 aggregate() 值:

> r = aggregate(data.frame(var1 = 1:10, var2 = 101:110), by=list(range=cut(1:10, breaks=c(2,4,8,10))), FUN = function(x) { c(obs=length(x), avg=mean(x), sd=sd(x)) })
> class(r)
[1] "data.frame"
> dim(r)
[1] 3 3
> r[,1]
[1] (2,4]  (4,8]  (8,10]
Levels: (2,4] (4,8] (8,10]
> r[,2]
     obs avg       sd
[1,]   2 3.5 0.707107
[2,]   4 6.5 1.290994
[3,]   2 9.5 0.707107
> r[,3]
     obs   avg       sd
[1,]   2 103.5 0.707107
[2,]   4 106.5 1.290994
[3,]   2 109.5 0.707107
> class(r[,2])
[1] "matrix"
> class(r[,3])
[1] "matrix"

【问题讨论】:

  • cbind 带有数字参数返回一个矩阵,而不是一个数据框。而且您不会期望在提供给 FUN 的匿名函数中指定列名。

标签: r aggregate


【解决方案1】:

提供数据框并了解聚合仅传递列向量,因此使用 x[ , "colname"] 注定要失败,因为“x”不是数据框:

 aggregate(data.frame(var1 = 1:10, var2 = 101:110), 
       by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
       FUN = function(x) 
         { 
         c(obs=length(x), avg=mean(x), sd=sd(x)) 
         })
#------------
   range  var1.obs  var1.avg   var1.sd    var2.obs    var2.avg     var2.sd
1  (2,4] 2.0000000 3.5000000 0.7071068   2.0000000 103.5000000   0.7071068
2  (4,8] 4.0000000 6.5000000 1.2909944   4.0000000 106.5000000   1.2909944
3 (8,10] 2.0000000 9.5000000 0.7071068   2.0000000 109.5000000   0.7071068

【讨论】:

  • “x”是矩阵吗?我不知道如何闯入那部分代码来检查对象。
  • "x" 在它/它们被传递给FUN 时将是一个(可能命名的)数字(原子)向量。它没有维度,因此既不是矩阵也不是数据框。
  • 很有趣,那么我们如何最终得到原始 data.frame 对象 (var1/var2) 中每一列的长度/平均值/标准差?如果 "x" 是一个简单的向量,是否意味着每个 data.frame 列都会调用一次 FUN?
  • FUN is 调用的次数与每列的 INDEX(而不是 by)参数中的类别一样多。这就是聚合存在的全部原因。所以 FUN 被称为 length(dfrm) * length(unique(by-vector)) 次。
  • aggregate 返回第一个标签列作为 by-argument 中唯一(排序)值的向量,然后基本上是 rbinds 每个列对 FUN 的多次调用中的值。执行实际“rbinding”的函数是sapply
【解决方案2】:

这是因为 aggregate 没有将 data.frames 传递给它的 FUN= 参数。它通过观察向量。此外,[, "name"] 索引不适用于矩阵。确保传入 data.frame 而不是示例中的矩阵。也许你想要by 函数

by(data.frame(var1 = 1:10, var2 = 101:110), 
    list(range=cut(1:10, breaks=c(2,4,8,10))), 
    FUN = function(x) { c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=sd(x[, "var2"])) })

【讨论】:

  • 我检查了聚合代码,如果它不是时间序列对象,它会将矩阵参数转换为 data.frame。 FUN 究竟需要哪个“观察向量”?
  • 它将列作为向量传递。它一次只能操作一列。
猜你喜欢
  • 2021-02-26
  • 2011-10-26
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多