在过滤矩阵列时保留列名。

9

我有一个矩阵,就像使用以下代码生成的那个:

> 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

请注意,这里的类仍然是矩阵(matrix):
> 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"

列名非常重要。

我希望保留矩阵结构(一个列的矩阵)和列名。

但是,列名更为重要。

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


它似乎经常出现。它可能在“R地狱”中,肯定在R-FAQ:7.4中(http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-do-my-matrices-lose-dimensions_003f),我今天在R-help上回答了一个稍微更晦涩的版本:https://stat.ethz.ch/pipermail/r-help/2013-April/350790.html - IRTFM
2个回答

16

您需要设置drop = FALSE。这是编程时的良好实践。

drop

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

m[,'a',drop=FALSE]

这将保留名称。


这个答案既优雅又有启发性。谢谢。 - htellez

4
您可以使用subset
m.a = subset(m, select = colnames(m) == "a")

使用 subset 而不是 [ 进行子集筛选,例如 subset(m, select = a) - mnel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接