基于具有索引的矩阵列表,创建具有1/0的矩阵列表

时间:2015-11-09 16:23:12

标签: r list matrix

我有以下问题: 我有一个带索引的矩阵列表。 矩阵的每一列显示该特定列的哪些行索引应该等于1。 所有其他值应等于0。 我知道输出矩阵的大小,并且列中没有重复的值。 例如,以下矩阵应翻译如下:

m_in  = matrix(c(1,3,5,7,3,4), nrow =2)
m_out = matrix(c(1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0), nrow = 7)

我确实制作了一个有效的代码,但如果我能以更有效/更聪明的方式实现这一目标,那将会很棒。

  Index <- matrix(20, 100, data = sample(1:200))
  Vector <- c(2,3,5,8,20)
  ListIndices <- sapply(Vector, function(x)Index[0:x,])
  emptylistlist <- list()
  for (i in 1: length(ListIndices)){
    for (j in 1 : 100){  
      emptylistlist[[i]] <- matrix(nrow = 200, ncol = 100, data = 0) 
      emptylistlist[[i]][ListIndices[[i]],j]<-1
    }
  }

2 个答案:

答案 0 :(得分:3)

我们可以从sparseMatrix尝试library(Matrix),然后用as.matrix打包。

library(Matrix)
as.matrix(sparseMatrix(i= c(m1), j= c(col(m1)), x=1))
#      [,1] [,2] [,3]
#[1,]    1    0    0
#[2,]    0    0    0
#[3,]    1    0    1
#[4,]    0    0    1
#[5,]    0    1    0
#[6,]    0    0    0
#[7,]    0    1    0

如果有list个矩阵,那么我们可以使用lapply

lapply(lst, function(y) as.matrix(sparseMatrix(i= c(y), j= c(col(y)), x= 1)))

答案 1 :(得分:1)

典型的方法是使用矩阵赋值:

m_out = matrix(0L, max(m_in), ncol(m_in))

m_out[cbind(c(m_in), c(col(m_in)))] <- 1L

工作原理: M[IND] <- V描述了矩阵赋值help("[<-")的语法。

  • IND的每一行都是M中的一对(行,列)位置。
  • 这些位置M的元素将被V的(相应元素)覆盖。

就矩阵列表而言,array会更自然:

set.seed(1)
Index <- matrix(20, 100, data = sample(1:200))
Vector <- c(2,3,5,8,20)
idx    <- sapply(Vector, function(x)Index[0:x,])
# "ListIndices" is too long a name

a_out = array(0L, dim=c(
  max(unlist(idx)), 
  max(sapply(idx,ncol)),
  length(idx)))

a_out[ cbind( 
  unlist(idx),
  unlist(lapply(idx,col)),
  rep(seq_along(idx),lengths(idx))
)] <- 1L

语法与矩阵赋值相同。

看到OP有这么多的零和那么少的,稀疏matrix,如@ akrun的答案最有意义,或稀疏array,如果已经实现了这样的事情