R中矩阵的行方差

R中矩阵的行方差,r,R,我想计算矩阵中每一行的方差。对于以下矩阵A [,1] [,2] [,3] [1,] 1 5 9 [2,] 5 6 10 [3,] 50 7 11 [4,] 4 8 12 我想去 [1] 16.0000 7.0000 564.3333 16.0000 我知道我可以通过apply(A,1,var)实现这一点,但有没有更快或更好的方法?从倍频程开始,我可以用var(A,0,2)来实现这一点,但我不知道如何使用R中va

我想计算矩阵中每一行的方差。对于以下矩阵
A

     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    5    6   10
[3,]   50    7   11
[4,]    4    8   12
我想去

[1]  16.0000   7.0000 564.3333  16.0000
我知道我可以通过
apply(A,1,var)
实现这一点,但有没有更快或更好的方法?从倍频程开始,我可以用
var(A,0,2)
来实现这一点,但我不知道如何使用R中
var()
函数的
Y
参数


编辑:典型块的实际数据集大约有100行和500列。但数据总量约为50GB。

这是
apply()
有用的主要原因之一。它意味着在数组或矩阵的边缘上操作

set.seed(100)
m <- matrix(sample(1e5L), 1e4L)
library(microbenchmark)
microbenchmark(apply(m, 1, var))
# Unit: milliseconds
#              expr      min       lq   median       uq      max neval
#  apply(m, 1, var) 270.3746 283.9009 292.2933 298.1297 343.9531   100 
set.seed(100)

m您可以使用
rowsumes
rowsmeans

RowVar <- function(x, ...) {
  rowSums((x - rowMeans(x, ...))^2, ...)/(dim(x)[2] - 1)
}

RowVar(A)
#[1]  16.0000   7.0000 564.3333  16.0000
您还可以创建一个更通用的函数,该函数将接收类似于
apply
的语法,但仍将保持矢量化(列方向的方差将较慢,因为需要先对矩阵进行转置)


MatVar是的,它的速度加快了一点(很多)。我生命中的最后298毫秒到哪里去了?如果你只想将它应用于列的子集呢?@skan因此矩阵中的子集,例如,
RowVar(a[,1:3)
将只在前3列上运行它。另外,请看一下
matrixStats
软件包,它们涵盖了几乎所有内容。您也可以直接从GH下载这些函数,请看,这太棒了。我可以将时间缩短一半。非常感谢!相关:您能告诉我们您的实际数据集的维度吗?我们将看看当我处理整个50GB时,这是否太多了,但是知道apply()是解决这个问题的方法已经很有帮助了。谢谢!
microbenchmark(apply(m, 1, var), RowVar(m))

## Unit: milliseconds
## expr        min         lq     median         uq        max neval
## apply(m, 1, var) 343.369091 400.924652 424.991017 478.097573 746.483601   100
##        RowVar(m)   1.766668   1.916543   2.010471   2.412872   4.834471   100
MatVar <- function(x, dim = 1, ...) {
  if(dim == 1){
     rowSums((x - rowMeans(x, ...))^2, ...)/(dim(x)[2] - 1)
  } else if (dim == 2) {
     rowSums((t(x) - colMeans(x, ...))^2, ...)/(dim(x)[1] - 1)
  } else stop("Please enter valid dimension")
}


MatVar(A, 1)
## [1]  16.0000   7.0000 564.3333  16.0000

MatVar(A, 2)
        V1         V2         V3 
## 547.333333   1.666667   1.666667