【问题标题】:Stats on every n rows for each column每列每 n 行的统计信息
【发布时间】:2014-08-06 01:23:10
【问题描述】:

我想计算每第 n 行(在我的情况下是每 6 行)(或样本)的平均值和标准差。下面的函数给了我每 6 行的平均值(96 行给了我 16 个平均值)

colMeans(matrix(data.trim$X0, nrow=6))

我想对所有列(总共 1280 个平均值)执行此操作。我尝试运行此功能:

colMeans(matrix(data.trim, nrow=6))

但这根本不起作用,我收到以下错误消息:

colMeans(matrix(data.trim, nrow = 6)) 中的错误:'x' 必须是数字

另外:警告信息:

在 matrix(data.trim, nrow = 6) 中:数据长度 [80] 不是行数 [6] 的约数或倍数

【问题讨论】:

标签: r matrix


【解决方案1】:

您可以使用sapply 将函数应用于每一列:

sapply(iris[1:4], function(x) colMeans(matrix(x, nrow=6)))
      Sepal.Length Sepal.Width Petal.Length Petal.Width
 [1,]     4.950000    3.383333     1.450000   0.2333333
 [2,]     4.850000    3.316667     1.483333   0.2000000
 [3,]     5.183333    3.633333     1.316667   0.2500000

...

[23,]     6.533333    2.950000     5.583333   1.9333333
[24,]     6.516667    3.033333     5.316667   2.1333333
[25,]     6.383333    3.033333     5.266667   2.1333333

与手动创建前六行的均值比较:

colMeans(iris[1:6, 1:4])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   4.9500000    3.3833333    1.4500000    0.2333333 

如果有正确的by 参数,您也可以使用aggregate 执行此操作:

aggregate(iris[1:4], by=list((seq(nrow(iris))-1) %/% 6), FUN=mean)
   Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1        0     4.950000    3.383333     1.450000   0.2333333
2        1     4.850000    3.316667     1.483333   0.2000000
3        2     5.183333    3.633333     1.316667   0.2500000

...

这通过创建一个向量来识别要平均的组:

(seq(nrow(iris))-1) %/% 6
  [1]  0  0  0  0  0  0  1  1  1  1  1  1  2  2  2  2  2  2  3  3  3  3  3  3  4  4  4  4  4  4  5  5  5  5  5  5  6  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8
 [53]  8  8  9  9  9  9  9  9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17
[105] 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24

sapply 解决方案返回一个矩阵,而 aggregate 解决方案返回一个数据框,以防更需要。

【讨论】:

    【解决方案2】:

    我认为您收到Errorwarning 消息的一个可能原因是因为您直接在data.frame 上应用了它。例如

    set.seed(48)
    d1 <- as.data.frame(matrix(sample(1:40, 80*96, replace=T), ncol=80))
    rowMeans(matrix(d1, ncol=6, byrow=T))
    #Error in rowMeans(matrix(d1, ncol = 6, byrow = T)) : 'x' must be numeric
    #In addition: Warning message:
    #In matrix(d1, ncol = 6, byrow = T) :
    #  data length [80] is not a sub-multiple or multiple of the number of rows [14]
    

    你可以unlistdata.frame

     res <- rowMeans(matrix(unlist(d1), ncol=6, byrow=T))
     dim(res) <- c(96/6, 80)
    length(res)
    #[1] 1280
    

    交叉检查@Matthew Lundberg 方法的结果

    res1 <- sapply(d1, function(x) colMeans(matrix(x, nrow=6)))
    
    all.equal(res,res1, check.attributes=F)
    [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2019-09-04
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多