我有一个矩阵
df <- matrix(c(9185, 3661, 9539, 4266, 9650, 3897, 9160, 4451), nrow = 2, ncol = 4)
我想计算: (element -mean(by row))/ sd(by row) 。 例如:(9185 - 9383,5)/248,03 并将结果代入矩阵中。像这样:
matrix(c(-0.80030564, -1.144503446, 0.62694, 0.553656, 1.074466, -0.482080851, -0.9011, 1.072928123), nrow = 2, ncol = 4)
问题是,在实际情况下,我需要迭代,并且我不知道将有多少列,但它们将是 df 数据框中存在的所有列。
您可以使用
apply()
对矩阵进行逐行计算。
df <- matrix(c(9185, 3661, 9539, 4266, 9650, 3897, 9160, 4451), nrow = 2, ncol = 4)
t(apply(df, 1, function(x)(x-mean(x))/sd(x)))
#> [,1] [,2] [,3] [,4]
#> [1,] -0.8003056 0.6269397 1.0744658 -0.9010998
#> [2,] -1.1445034 0.5536562 -0.4820809 1.0729281
此外,
scale()
是一个可以进行您想要的计算的函数
t(apply(df, 1, scale))
#> [,1] [,2] [,3] [,4]
#> [1,] -0.8003056 0.6269397 1.0744658 -0.9010998
#> [2,] -1.1445034 0.5536562 -0.4820809 1.0729281
创建于 2023 年 10 月 2 日,使用 reprex v2.0.2
如果你追求速度,你可以尝试定义一个自定义的“
scale
”函数,如下所示
f2 <- function(df) {
(df - rowMeans(df)) / sqrt(1 / (1 - 1 / ncol(df)) * (rowMeans(df^2) - rowMeans(df)^2))
}
你会看到的
> f2(df)
[,1] [,2] [,3] [,4]
[1,] -0.8003056 0.6269397 1.0744658 -0.9010998
[2,] -1.1445034 0.5536562 -0.4820809 1.0729281
f1 <- function(df) {
t(apply(df, 1, scale))
}
f2 <- function(df) {
(df - rowMeans(df)) / sqrt(1 / (1 - 1 / ncol(df)) * (rowMeans(df^2) - rowMeans(df)^2))
}
microbenchmark(
f_DaveArmstong = f1(df),
f_TIC = f2(df),
check = "equivalent",
unit = "relative"
)
给予
Unit: relative
expr min lq mean median uq max neval
f_DaveArmstong 17.09756 16.78235 2.380846 15.04688 14.59606 0.2508871 100
f_TIC 1.00000 1.00000 1.000000 1.00000 1.00000 1.0000000 100