我想知道将scale()函数应用于数据框时的输出,您得到一个矩阵。查看输出的属性时,我看到有两个元素
attr(,"scaled:center")
col1 mean col2 mean etc
attr(,"scaled:scale")
col1 sd col2 sd etc
这两个属性如何精确地适合scale()给定的矩阵。首先,尚不清楚如何使用数字矢量命名属性,将数字矢量作为属性分配时,我还找不到任何东西。第二,如何访问这些值?假设我想反转应用于矩阵A的比例函数,例如
(A * A$scaled:scale) + A$scaled:center
不起作用。我真的对这里发生的事情不知所措,并且非常感谢关于这些向量是什么的任何建议或指导(仅将两个额外的行附加到初始矩阵上?)以及如何访问它们的值。谢谢!
答案 0 :(得分:0)
您可以访问以下属性:
m <- matrix(1:25,5,5)
ms <- scale(m)
# See all attributes
> attributes(ms)
$dim
[1] 5 5
$`scaled:center`
[1] 3 8 13 18 23
$`scaled:scale`
[1] 1.581139 1.581139 1.581139 1.581139 1.581139
> attr(x = ms,"dim")
[1] 5 5
> attr(x = ms,which = "scaled:center")
[1] 3 8 13 18 23
您可以添加如下新属性:
attr(ms,"foo") <- 1:10
> attributes(ms)
$dim
[1] 5 5
$`scaled:center`
[1] 3 8 13 18 23
$`scaled:scale`
[1] 1.581139 1.581139 1.581139 1.581139 1.581139
$foo
[1] 1 2 3 4 5 6 7 8 9 10
答案 1 :(得分:0)
正如@joran指出的那样,属性实际上并不是矩阵中的命名项目,而是需要使用attr()
进行访问。通过以下操作,您可以恢复原始数据(在数字精度范围内:
apply( sweep(ms, 2, attr(ms,"scaled:scale"), '*') ,
2, # Need to add back column-by-column
'+', attr(ms,"scaled:center"))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 7 7 7 7 7
[3,] 13 13 13 13 13
[4,] 19 19 19 19 19
[5,] 25 25 25 25 25
您首先要反转居中值的比例,然后使结果“未居中”。需要以与scale.default
相同的原始算法的相反顺序进行。
另一种方法是对sweep
进行“嵌套”调用。我的第一场努力使我误以为需要替代申请清扫:
> sweep( sweep(ms, 2, attr(ms,"scaled:scale"), '*') ,
2, attr(ms,"scaled:center"),'+')
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
attr(,"scaled:center")
[1] 3 8 13 18 23
attr(,"scaled:scale")
[1] 1.581139 1.581139 1.581139 1.581139 1.581139
最好将这些属性为NULL,因为“取消扫描”操作不会影响它们。