我怎么能在不知道r中有多少列的情况下改变列中的值呢?

dzhpxtsq  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个矩阵
df <- matrix(c(9185, 3661, 9539, 4266, 9650, 3897, 9160, 4451), nrow = 2, ncol = 4)
我想计算一下:(元素-平均值(按行))/标准差(按行)。例如:(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重新排序。

gwo2fgha

gwo2fgha1#

您可以使用apply()对矩阵进行逐行计算。

  1. df <- matrix(c(9185, 3661, 9539, 4266, 9650, 3897, 9160, 4451), nrow = 2, ncol = 4)
  2. t(apply(df, 1, function(x)(x-mean(x))/sd(x)))
  3. #> [,1] [,2] [,3] [,4]
  4. #> [1,] -0.8003056 0.6269397 1.0744658 -0.9010998
  5. #> [2,] -1.1445034 0.5536562 -0.4820809 1.0729281

另外,scale()是一个执行所需计算的函数

  1. t(apply(df, 1, scale))
  2. #> [,1] [,2] [,3] [,4]
  3. #> [1,] -0.8003056 0.6269397 1.0744658 -0.9010998
  4. #> [2,] -1.1445034 0.5536562 -0.4820809 1.0729281

创建于2023-10-02使用reprex v2.0.2

wgx48brx

wgx48brx2#

如果你追求速度,你可以尝试定义一个自定义的“scale“函数,如下所示

  1. f2 <- function(df) {
  2. (df - rowMeans(df)) / sqrt(1 / (1 - 1 / ncol(df)) * (rowMeans(df^2) - rowMeans(df)^2))
  3. }

你会发现

  1. > f2(df)
  2. [,1] [,2] [,3] [,4]
  3. [1,] -0.8003056 0.6269397 1.0744658 -0.9010998
  4. [2,] -1.1445034 0.5536562 -0.4820809 1.0729281

基准测试

  1. f1 <- function(df) {
  2. t(apply(df, 1, scale))
  3. }
  4. f2 <- function(df) {
  5. (df - rowMeans(df)) / sqrt(1 / (1 - 1 / ncol(df)) * (rowMeans(df^2) - rowMeans(df)^2))
  6. }
  7. microbenchmark(
  8. f_DaveArmstong = f1(df),
  9. f_TIC = f2(df),
  10. check = "equivalent",
  11. unit = "relative"
  12. )

  1. Unit: relative
  2. expr min lq mean median uq max neval
  3. f_DaveArmstong 17.09756 16.78235 2.380846 15.04688 14.59606 0.2508871 100
  4. f_TIC 1.00000 1.00000 1.000000 1.00000 1.00000 1.0000000 100
展开查看全部

相关问题