【问题标题】:Retain column names after permutation of table in R在R中的表排列后保留列名
【发布时间】:2020-08-19 05:31:40
【问题描述】:

我在 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

现在我想用我已经找到的仅包含 1 和 0 的矩阵 P 置换表格(重点是 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 &lt;- x %*% P

您会看到,虽然对角线排列正确,但 x 中的列名已被 P 中的矩阵列名替换(在本例中为 [,1] [,2] [,3])。

如何执行排列 (x %*% P),同时以 正确 顺序保留 x 中的列名?也就是说,当列移动时,列名跟随列。所以在这种情况下,列名将是2 3 1。

【问题讨论】:

  • 你能显示预期的输出吗

标签: r sorting matrix contingency


【解决方案1】:

如果打算保留列名,请在创建 'x' 到 'Y' 的副本后使用 []

Y <- x
Y[] <- x %*% P

【讨论】:

  • 这只是保留了旧的列名。我想置换它们。
  • @MobeusZoom 不清楚。你的问题似乎是How can I perform the permutation (x %*% P) while retaining the column names from x in the correct order?
  • 我的问题很清楚。请参阅最后两句话,除了描述它(以明确排除您的解释的方式)之外,我还为我的问题中的示例给出了所需的列顺序。
  • @MobeusZoom 好的,谢谢。无论如何,您已经选择了另一个解决方案。所以,希望这个问题得到解决。
  • 感谢您的意见!非常欢迎您提供信息,即使它不是确切的问题,我相信它对某人有帮助
【解决方案2】:

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

编辑添加:正如在 cmets 中出现的那样,如果 P 是用数字计算的,它可能不包含精确的 0 和 1 值,所以你应该使用

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

避免舍入误差。

【讨论】:

  • 谢谢,很好的解决方案。但是当我尝试使用colnames(x)[1:nrow(x) %*% P] 时,它有时会给我一个Error in dimnames(x) &lt;- dn : length of 'dimnames' [2] not equal to array extent。知道为什么吗?当我在控制台中分别输入1:nrow(x) %*% P 和colnames(x) 时,我得到了相同长度的向量,但colnames(x)[1:nrow(x) %*% P] 的结果由于某种原因丢弃了其中一项。 (如果有帮助,P 作为已解决的对象 (solution) 从库 lp.assign 中获得,来自库 lpSolve。)
  • 可能是舍入错误:如果P包含与1和0略有不同的数字,则会影响索引。如果不能通过构造保证它是整数值,我会在公式中使用 round(P) 而不是 P。
猜你喜欢
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2015-09-12
相关资源
最近更新 更多