访问矩阵中的命名属性

时间:2018-11-09 23:02:07

标签: r scale

我想知道将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 

不起作用。我真的对这里发生的事情不知所措,并且非常感谢关于这些向量是什么的任何建议或指导(仅将两个额外的行附加到初始矩阵上?)以及如何访问它们的值。谢谢!

2 个答案:

答案 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,因为“取消扫描”操作不会影响它们。