如何在不知道 r 数据框中有多少列的情况下更改列中的值?

问题描述 投票:0回答:2

我有一个矩阵

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 数据框中存在的所有列。

r matrix iteration mean
2个回答
4
投票

您可以使用

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


0
投票

如果你追求速度,你可以尝试定义一个自定义的“

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
© www.soinside.com 2019 - 2024. All rights reserved.