在双矩阵中提取行

时间:2014-01-10 23:26:53

标签: r matrix

我在R中有一个双矩阵作为数据框V,如下所示:

row.names id1 id2 id3
id1        0   2   4
id2        1   0   3     
id3        5   1   0
...

如何提取row.names = id2?

的行

我尝试了以下内容:

id2_row<-V[V[,1]=='id2',]

它不起作用。是因为我有双矩阵吗?我的理解是双矩阵不是数字,因此我不能执行以下操作:V[V[,1]=='id2',]。这是对的吗?

2 个答案:

答案 0 :(得分:3)

生成一些数据

m <- matrix(c(0, 1, 5, 2, 0, 1, 4, 3, 0), nrow = 3)
df <- as.data.frame(m)
row.names(df) <- c("id1", "id2", "id3")

设置data.frame并保留其名称

with_names <- df[2,]

# 1)
print(with_names)
##    V1 V2 V3
##id2  1  0  3

# 2)
df[row.names(df) == "id2" , ]
##    V1 V2 V3
##id2  1  0  3

仅供参考:这是子集data.frames的另一个选项。我添加它是为了完整。

df[2, , drop = TRUE]

子集data.table。 没有row.names,但子集的工作速度更快。

require(data.table)
DT <- data.table(m)
print(DT)
setkey(DT, V1, V2, V3)
print(DT)
DT[2]

子集matrix。您可以再次对您所拥有的行进行子集化,但不会获得任何名称。

class(m)
## [1] "matrix"

# Method 1)
m[2,]
## [1] 1 0 3

# Method 2)
ind <- matrix(c(2, 2, 2, 1, 2, 3), nrow = 3)
m[ind]
identical(m[2,], m[ind])
## [1] TRUE

答案 1 :(得分:2)

这是R,因此有很多可能性。最好的方法取决于V究竟是什么以及您希望id2_row成为什么。

如果V是数字矩阵,那么您可以尝试V["id2", ]

id2_row <- V[rownames(V) == "id2", ] 

如果V是数据框,而id2是行名,则同样适用:V["id2", ]

id2_row <- V[rownames(V) == "id2", ] 

如果V是数据框,而row.names是V列,那么您的建议应该有效,或等效

id2_row <- V[V$row.names == "id2", ]