我正在使用
scale()
函数缩放多列。
如何仅从
scale()
中提取缩放值并删除所有属性?
set.seed(5)
data.frame(x1 = runif(10, 1, 5),
x2 = runif(10, 1, 5),
x3 = runif(10, 1, 5)) |>
mutate(across(.cols = num_range('x', 1:3),
.fns = scale,
.names = '{.col}_z')) |>
str()
回归
'data.frame': 10 obs. of 6 variables:
$ x1 : num 2.71 3.45 2.91 3.67 1.09 ...
$ x2 : num 3.33 1.74 2.91 2.05 4.26 ...
$ x3 : num 1.9 1.44 4.6 1.07 1.68 ...
$ x1_z: num [1:10, 1] -0.336 0.352 -0.155 0.559 -1.84 ...
..- attr(*, "scaled:center")= num 3.07
..- attr(*, "scaled:scale")= num 1.08
$ x2_z: num [1:10, 1] 0.61 -1.006 0.181 -0.688 1.55 ...
..- attr(*, "scaled:center")= num 2.73
..- attr(*, "scaled:scale")= num 0.985
$ x3_z: num [1:10, 1] -0.672 -0.973 1.079 -1.213 -0.816 ...
..- attr(*, "scaled:center")= num 2.94
..- attr(*, "scaled:scale")= num 1.54
默认情况下,
center
函数的scale
和scale
参数设置为TRUE
。
scale(x, center = TRUE, scale = TRUE)
在文档的Value部分,它指出:
For scale.default, the centered, scaled matrix. The numeric centering and scalings used (if any) are returned as attributes "scaled:center" and "scaled:scale"
这些属性就是您在输出中看到的。如果你想排除属性,你可以对输出进行切片以获得返回的矩阵并排除其余的,如@stefan评论
set.seed(5)
data.frame(x1 = runif(10, 1, 5),
x2 = runif(10, 1, 5),
x3 = runif(10, 1, 5)) |>
dplyr::mutate(across(.cols = num_range('x', 1:3),
.fns = ~scale(.x, center = T, scale = T)[, 1],
.names = '{.col}_z')) |>
str()
回归
'data.frame': 10 obs. of 6 variables:
$ x1 : num 2.78 1.24 2.1 1.12 1.06 ...
$ x2 : num 4.26 1.94 4.31 3.13 4.72 ...
$ x3 : num 2.54 3.27 4.69 4.9 4.73 ...
$ x1_z: num 0.459 -1.082 -0.219 -1.195 -1.262 ...
$ x2_z: num 0.806 -1.517 0.849 -0.324 1.258 ...
$ x3_z: num -0.465 0.261 1.684 1.9 1.728 ...
希望这有帮助
这是一个愚蠢但有效的方法:
X0 <- scale(matrix(rnorm(20),4,5)) # has attributes
X <- X0[,1:5] # same matrix without attributes
只需抓取矩阵的所有列并将它们存储在一个新矩阵中。 这消除了属性。