我正在尝试对矩阵进行子集化,这样我才能得到第一个变量大于第二个变量的矩阵。我的矩阵out
是3000x2
矩阵。
我试过
out<-out[out[,1] > out[,2]]
但这完全消除了row.names,我得到一个1到3000之间的整数字符串。是否有办法保留row.names
?
答案 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
除了检查一行结果并指定行名外,似乎没有简单的解决方法。