8

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

> 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"

列的名称非常重要。

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

但是,列的名称更重要。

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

4

2 回答 2

15

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

降低

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

m[,'a',drop=FALSE]

这也将保留名称。

于 2013-04-04T02:42:49.797 回答
4

您还可以使用subset

m.a = subset(m, select = colnames(m) == "a")
于 2013-04-04T02:46:29.827 回答