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