过滤矩阵列时保留列名称

时间:2013-04-04 02:30:10

标签: r matrix

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

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

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

> 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

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

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

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

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

> class(m[, colnames(m) == "a"]);
[1] "integer"

列的名称非常重要。

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

但是,列的名称更重要。

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

2 个答案:

答案 0 :(得分:13)

您需要设置drop = FALSE。这是程序化使用的好习惯

  

     

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

m[,'a',drop=FALSE]

这也将保留名称。

答案 1 :(得分:3)

您还可以使用subset

m.a = subset(m, select = colnames(m) == "a")