【问题标题】:Accessing Named Attribute in a Matrix访问矩阵中的命名属性
【发布时间】:2018-11-09 23:02:07
【问题描述】:

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

不起作用。我真的对这里发生的事情感到迷茫,并且非常感谢有关这些向量是什么的任何建议或指导(只是在初始矩阵上附加了两行?)以及如何访问它们的值。谢谢!

【问题讨论】:

    标签: r scale


    【解决方案1】:

    您可以像这样访问属性:

    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
    

    【讨论】:

      【解决方案2】:

      正如@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 可能会更好,因为“取消扫描”操作不会触及它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 2011-10-15
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多