子集矩阵,同时保留row.names

时间:2013-12-04 06:58:18

标签: r matrix performance

我正在尝试对矩阵进行子集化,这样我才能得到第一个变量大于第二个变量的矩阵。我的矩阵out3000x2矩阵。

我试过

out<-out[out[,1] > out[,2]]

但这完全消除了row.names,我得到一个1到3000之间的整数字符串。是否有办法保留row.names

2 个答案:

答案 0 :(得分:1)

矩阵被R视为具有列和行的向量。

> A <- matrix(1:9, ncol=3)

# A is filled with 1,...,9 columnwise
> A
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

# only elements with even number in 2nd column of same row

> v <- A[A[,2] %% 2 == 0]

> m <- A[A[,2] %% 2 == 0,]

> v
[1] 1 3 4 6 7 9

> m
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    3    6    9

# The result of evaluating odd/even-ness of middle column.
# This boolean vector is repeated column-wise by default
# until all element's fate in A is determined.

> A[,2] %% 2 == 0
[1]  TRUE FALSE  TRUE

当您省略逗号(v)时,您将A作为一维数据结构进行处理,R隐含地将您的表达式作为向量处理。

v在这个意义上不是“整数字符串”而是整数向量。当你添加逗号时,你告诉R你的条件只对第一个维度进行处理,同时指示第二个维度(在逗号之后) - 这会导致R将表达式作为矩阵处理(m)。

答案 1 :(得分:0)

值得注意的是,如果您只返回一行的子集以形成一维为单位的矩阵,则R将删除行名称: m <- matrix(1:9, ncol = 3) rownames(m) <- c("a", "b", "c") m[1, ] # lost the row name m[1, , drop = FALSE] # got row name back and a matrix m[c(1,1), ] # the row name is back when result has nrow > 1 除了检查一行结果并指定行名外,似乎没有简单的解决方法。