【发布时间】:2022-12-18 17:41:49
【问题描述】:
我正在使用 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
【问题讨论】:
-
一般来说,属性不会造成任何伤害,也没有理由删除它们,但如果你在它们上运行
as.numeric,它会将它们变成没有属性的普通numeric向量。 -
^ 这可以通过
.fns = ~as.numeric(scale(.)),实现 -
另请注意,
scale返回的是array而不是向量。因此,另一种选择是执行.fns = ~scale(.x)[, 1]来获取向量并删除属性。