Сохранить имена столбцов после перестановки таблицы в R - PullRequest
0 голосов
/ 04 мая 2020

У меня есть таблица в R, где имена строк (по умолчанию) A, B, C, ... и имена столбцов 1,2,3,4, ... как назначено. Например, вывод

x <- as.table(matrix(c(2,20,3,4,2,5,8,1,3),nrow=3,ncol=3,byrow=TRUE))
colnames(x) <- seq(1,ncol(x))
x

Теперь я хотел бы переставить таблицу с помощью матрицы P, которую я уже нашел, содержащей только 1 и 0 (точка в том, что A %*% P будет переставить столбцы A, чтобы увеличить его диагональ). В этом случае для x вы можете получить P как

P <- matrix(c(0,0,1,1,0,0,0,1,0),nrow=3,byrow=T)

Примечание. P будет иметь только одну '1' на строку и столбец, остальные - '0'. Моя проблема: если вы сделаете что-то вроде

Y <- x %*% P

, вы увидите, что, хотя диагонали расположены правильно, имена столбцов из x были заменены именами столбцов матрицы из P ([, 1] [, 2] [, 3] в данном случае).

Как выполнить перестановку (x %*% P), сохранив имена столбцов из x в правильном заказ? То есть имя столбца следует за столбцом при его перемещении. Таким образом, в этом случае имена столбцов будут 2 3 1.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Если вы хотите сохранить имена столбцов, используйте [] после создания копии от 'x' до 'Y'

Y <- x
Y[] <- x %*% P
0 голосов
/ 04 мая 2020

Вам придется переставлять имена столбцов x таким же образом. Например:

colnames(Y) <- 1:3 %*% P
Y

, который печатает

   2 3 1
A 20 3 2
B  2 5 4
C  1 3 8

Это было очень просто, потому что исходные имена столбцов были целыми числами 1: 3. В общем, вам понадобится что-то вроде

colnames(Y) <- colnames(x)[1:3 %*% P]

. Чтобы проверить, переставьте столбцы Y:

Z <- Y %*% P
colnames(Z) <- colnames(Y)[1:3 %*% P]
Z

, которые печатают

  3 1  2
A 3 2 20
B 5 4  2
C 3 8  1

Отредактировано в add: Как было отмечено в комментариях, если P вычисляется численно, оно может не содержать точных значений 0 и 1, поэтому вы должны использовать

colnames(Y) <- colnames(x)[1:3 %*% round(P)]

, чтобы избежать ошибки округления.

...