Доступ к именованному атрибуту в матрице - PullRequest
0 голосов
/ 10 ноября 2018

Меня интересует вывод при применении функции 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 голосов
/ 10 ноября 2018

Как отметил @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

Вероятно, было бы лучше обнулить эти атрибуты, так как они не были затронуты операцией "unsweep".

0 голосов
/ 10 ноября 2018

Вы можете получить доступ к таким атрибутам, как это:

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
...