2016-07-15 173 views
1

三个定义的列鉴于m转换矩阵中的R

m <- structure(c(5, 1, 3, 2, 1, 4, 5, 2, 5, 1, 1, 5, 1, 4, 0, 4, 5, 
5, 3, 2, 0, 0, 3, 0, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(7L, 
5L)) 

    # [,1] [,2] [,3] [,4] [,5] 
# [1,] 5 2 0 0 0 
# [2,] 1 5 4 3 0 
# [3,] 3 1 5 0 0 
# [4,] 2 1 5 3 0 
# [5,] 1 5 3 2 0 
# [6,] 4 1 2 3 0 
# [7,] 5 4 0 0 0 

考虑元件1,它出现在5行(2, 3, 4, ,5, 6)和各列方向指数(1, 2, 2, 1, 2)。我想有以下几点:

1 2 1 
1 3 2 
1 4 2 
1 5 1 
1 6 2 

再举一个例子,考虑元素2,它出现在4行(1, 4, 5, 6)和相应逐列指数(2, 1, 4, 3)我们有:

1 2 1 
1 3 2 
1 4 2 
1 5 1 
1 6 2 
2 1 2 
2 4 1 
2 5 4 
2 6 3 

我想要的是所有1-5的n*3矩阵。 优选地,在基础R

回答

3

我们可以用与whicharr.ind=TRUE

cbind(val= 1, which(m==1, arr.ind=TRUE)) 
#  val row col 
#[1,] 1 2 1 
#[2,] 1 5 1 
#[3,] 1 3 2 
#[4,] 1 4 2 
#[5,] 1 6 2 

对于多情况下,如@RHertel提到

for(i in 1:5) print(cbind(i,which(m==i, arr.ind=TRUE))) 

或用lapply

do.call(rbind, lapply(1:2, function(i) { 
     m1 <-cbind(val=i,which(m==i, arr.ind=TRUE)) 
     m1[order(m1[,2]),]})) 
#  val row col 
#[1,] 1 2 1 
#[2,] 1 3 2 
#[3,] 1 4 2 
#[4,] 1 5 1 
#[5,] 1 6 2 
#[6,] 2 1 2 
#[7,] 2 4 1 
#[8,] 2 5 4 
#[9,] 2 6 3 

由于OP提到约base R解决方案,上述将有所帮助。但是,在情况下,如果有人想一个紧凑的解决方案,

library(reshape2) 
melt(m) 

,然后子集的感兴趣的值。

1

一个方便的方式来改造它是使用sparseMatrixMatrix库,由于所需输出非常接近稀疏矩阵的表示:

library(Matrix) 
summary(Matrix(m, sparse = T)) 
# 7 x 5 sparse Matrix of class "dgCMatrix", with 23 entries 
# i j x 
# 1 1 1 5 
# 2 2 1 1 
# 3 3 1 3 
# 4 4 1 2 
# 5 5 1 1 
# 6 6 1 4 
# 7 7 1 5 
# 8 1 2 2 
# 9 2 2 5 
# 10 3 2 1 
# 11 4 2 1 
# 12 5 2 5 
# 13 6 2 1 
# 14 7 2 4 
# 15 2 3 4 
# 16 3 3 5 
# 17 4 3 5 
# 18 5 3 3 
# 19 6 3 2 
# 20 2 4 3 
# 21 4 4 3 
# 22 5 4 2 
# 23 6 4 3 

为了看得更清楚:

summary(Matrix(m, sparse = T)) %>% dplyr::arrange(x) 
# i j x 
# 1 2 1 1 
# 2 5 1 1 
# 3 3 2 1 
# 4 4 2 1 
# 5 6 2 1 
# 6 4 1 2 
# 7 1 2 2 
# 8 6 3 2 
# 9 5 4 2 
# 10 3 1 3 
# 11 5 3 3 
# 12 2 4 3 
# 13 4 4 3 
# 14 6 4 3 
# 15 6 1 4 
# 16 7 2 4 
# 17 2 3 4 
# 18 1 1 5 
# 19 7 1 5 
# 20 2 2 5 
# 21 5 2 5 
# 22 3 3 5 
# 23 4 3 5 
2

只需使用rowcol即可。

> data.frame(m=as.vector(m), row=as.vector(row(m)), col=as.vector(col(m))) 
    m row col 
1 5 1 1 
2 1 2 1 
3 3 3 1 
4 2 4 1 
5 1 5 1 
... 

子集,排序,并且如期望的打印。

> tmp <- out[order(out$m, out$row), ] 
> print(subset(tmp, m==1), row.names=FALSE) 
m row col 
1 2 1 
1 3 2 
1 4 2 
1 5 1 
1 6 2