我有以下问题: 我有一个带索引的矩阵列表。 矩阵的每一列显示该特定列的哪些行索引应该等于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
}
}
答案 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
,如果已经实现了这样的事情