首页 > 解决方案 > 使用列名删除 R 矩阵中的列 - 与顺序无关

问题描述

我无法使用列名删除矩阵中的列 - 输出取决于列名的顺序。

matrix <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), 3,4,dimnames = list(c("R1","R2","R3"), c("C1","C2","C3","C4")))

setA <- c("C2","C3")
setB <- c("C3","C2")

matrixA <- matrix[, colnames(matrix)!=setA]
matrixB <- matrix[, colnames(matrix)!=setB]

我期望两种情况下的输出相同(预期输出是矩阵B的输出)

但是,我得到的实际输出是:

> matrixA
   C1 C2 C3 C4
R1  1  4  7 10
R2  2  5  8 11
R3  3  6  9 12
> matrixB
   C1 C4
R1  1 10
R2  2 11
R3  3 12

在我的实际问题中,我将不得不以随机顺序选择 setA 的元素。我如何确保实际删除了这些列?

标签: rmatrix

解决方案


那是因为 和 的元素setAsetB回收与 具有相同的长度colnames(matrix)

setAc("C2", "C3", "C2", "C3")使用时会变成colnames(matrix)!=setA. 同样,在 中使用时setB将变为。这就是为什么选择所有列,而只选择 2 列的原因。c("C3", "C2", "C3", "C2")colnames(matrix)!=setBsetAsetB

colnames(matrix)
[1] "C1" "C2" "C3" "C4"

colnames(matrix)!=setA
[1] TRUE TRUE TRUE TRUE

colnames(matrix)!=setB
[1]  TRUE FALSE FALSE  TRUE

您可以使用以下内容省略不需要的列。

!colnames(matrix) %in% setB
[1]  TRUE FALSE FALSE  TRUE

推荐阅读