正如我们所知,内置的scale()
函数输入一个矩阵(或数字数据帧(,并计算每列的z分数。scale()
的输出是一个矩阵对象,它具有称为"scaled:center"
和"scaled:scale"
的附加属性,分别包含计算z分数时使用的平均值和标准差。现在我有一个名为trees
的示例数据帧,来自RStudio环境中的"package:datasets"
,例如
> trees
Girth Height Volume
1 8.3 70 10.3
2 8.6 65 10.3
3 8.8 63 10.2
4 10.5 72 16.4
5 10.7 81 18.8
6 10.8 83 19.7
现在我需要使用scale()
函数来计算trees
数据集中每个变量的z分数,我尝试只使用带有以下额外参数的scale()
函数,它可以完美地进行
test1 <- scale(trees, center = TRUE, scale = TRUE)
attributes(test1)
您可以看到基于可选参数center
和scale
的新添加属性,如下所示:
$`scaled:center`
Girth Height Volume
13.24839 76.00000 30.17097
$`scaled:scale`
Girth Height Volume
3.138139 6.371813 16.437846
但是,当我在apply
函数中尝试scale
函数时,结果是在没有新属性的情况下,这些新属性假设与上述相同,请帮助弄清楚为什么以及如何使scale
函数与apply
一起工作。
test2 <- apply(trees, 2, scale, center = TRUE, scale = TRUE)
attributes(test2) # No attribute comes out
我们也可以使用purrr
中的map
library(purrr)
map(trees, scale, center = TRUE, scale = TRUE)
apply
返回与所用MARGIN
相同维度的输出。请改用lapply
,它将返回一个列表。
test2 <- lapply(trees, scale, center = TRUE, scale = TRUE)
attributes(test2[[1]])
#$dim
#[1] 31 1
#$`scaled:center`
#[1] 13.25
#$`scaled:scale`
#[1] 3.138