在 R 中 table 排列后保留列名

Retain column names after permutation of table in R

我在 R 中有一个 table,其中行名(默认情况下)是 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 置换 table,我已经找到它,它只包含 1 和 0(重点是 A %*% P 将置换列A 以便最大化其对角线)。在这种情况下,对于 x 你可以得到 P as

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 中的列名称的同时执行排列 (x %*% P)?也就是说,列移动时,列名跟随列。所以在这种情况下,列名将是 2 3 1.

如果打算保留列名,请在创建 'x' 到 'Y'

的副本后使用 []
Y <- x
Y[] <- x %*% P

您必须以相同的方式排列 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

编辑添加:如评论中所述,如果 P 是数字计算的,它可能不包含精确的 0 和 1 值,因此您应该使用

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

以避免舍入错误。