过滤矩阵列时保留列名称

hte*_*lez 8 r matrix

我有一个矩阵,就像用这段代码生成的矩阵:

> m = matrix(data=c(1:50), nrow= 10, ncol = 5);
> colnames(m) = letters[1:5];
Run Code Online (Sandbox Code Playgroud)

如果我过滤列,并且结果有多个列,则新矩阵会保留名称.例如:

> m[, colnames(m) != "a"];

       b  c  d  e
 [1,] 11 21 31 41
 [2,] 12 22 32 42
 [3,] 13 23 33 43
 [4,] 14 24 34 44
 [5,] 15 25 35 45
 [6,] 16 26 36 46
 [7,] 17 27 37 47
 [8,] 18 28 38 48
 [9,] 19 29 39 49
[10,] 20 30 40 50
Run Code Online (Sandbox Code Playgroud)

请注意,这里的类仍然是矩阵:

> class(m[, colnames(m) != "a"]);
[1] "matrix"
Run Code Online (Sandbox Code Playgroud)

但是,当过滤器只允许一列时,结果是向量(在这种情况下为整数向量)和列名称丢失.

> m[, colnames(m) == "a"]
[1]  1  2  3  4  5  6  7  8  9 10

> class(m[, colnames(m) == "a"]);
[1] "integer"
Run Code Online (Sandbox Code Playgroud)

列的名称非常重要.

我想保留矩阵结构(一列矩阵)和列名.

但是,列的名称更重要.

我已经知道如何解决这个问题(通过跟踪每个案例).我想知道是否有一个优雅,有启发性的解决方案.

mne*_*nel 14

你需要设置drop = FALSE.这是编程使用的好习惯

下降

对于矩阵和数组.如果为TRUE,则将结果强制转换为可能的最低维度(请参阅示例)

m[,'a',drop=FALSE]
Run Code Online (Sandbox Code Playgroud)

这也将保留名称.