如何解决从列表创建稀疏矩阵
我希望从sparse matrix
创建一个list
。我可以使用此处介绍的方法来创建典型的matrix
:
Class of output object differs as input data differs
下面是典型的matrix
的一个小的可复制示例。
set.seed(1234)
# determine number of observations in each sample
n.samples <- 20
max.obs <- 10
obs.per.sample <- sample(0:max.obs,size = n.samples,prob = c(0.70,0.15,0.05,0.03,rep(0.01,7)),replace = TRUE)
# determine size of each observation in a sample
# here obs.size is a list
my.sizes <- seq(10,32,2)
size.probs <- c(0.02,0.04,0.06,0.08,0.10,0.12,0.14,0.16,0.02)
obs.size <- sapply(obs.per.sample,function(x) sample(my.sizes,size = x,prob = size.probs,replace=TRUE))
# create matrix of observation sizes in all samples
max.samples <- max(lengths(obs.size))
mat <- matrix(c(sapply(obs.size,`[`,1:max.samples)),nrow = n.samples,byrow = TRUE)
mat[is.na(mat)] <- 0
mat
# [,1] [,2] [,3]
# [1,] 0 0 0
# [2,] 0 0 0
# [3,] 0 0 0
# [4,] 0 0 0
# [5,] 22 22 0
# [6,] 0 0 0
# [7,] 0 0 0
# [8,] 0 0 0
# [9,] 0 0 0
#[10,] 0 0 0
#[11,] 0 0 0
#[12,] 0 0 0
#[13,] 0 0 0
#[14,] 24 24 26
#[15,] 0 0 0
#[16,] 16 0 0
#[17,] 0 0 0
#[18,] 0 0 0
#[19,] 0 0 0
#[20,] 0 0 0
解决方法
也许您可以尝试以下基本R选项
l <- lengths(obs.size)
mat <- matrix(0,length(obs.size),max(l))
mat[cbind(rep(which(l>0),l[l>0]),sequence(l[l>0]))] <- unlist(obs.size)
其中非零值的索引以cbind(rep(which(l>0),sequence(l[l>0]))
为特征,而您只需将非零值unlist(obs.size)
分配给这些位置。
- 输出
> mat
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
[4,] 0 0 0
[5,] 22 22 0
[6,] 0 0 0
[7,] 0 0 0
[8,] 0 0 0
[9,] 0 0 0
[10,] 0 0 0
[11,] 0 0 0
[12,] 0 0 0
[13,] 0 0 0
[14,] 24 24 26
[15,] 0 0 0
[16,] 16 0 0
[17,] 0 0 0
[18,] 0 0 0
[19,] 0 0 0
[20,] 0 0 0
如果您需要稀疏矩阵,则可能需要Matrix
软件包的帮助,例如
library(Matrix)
l <- lengths(obs.size)
mat <- sparseMatrix(
i = rep(which(l > 0),l[l > 0]),j = sequence(l[l > 0]),x = unlist(obs.size)
)
这样
> mat
16 x 3 sparse Matrix of class "dgCMatrix"
[1,] . . .
[2,] . . .
[3,] . . .
[4,] . . .
[5,] 22 22 .
[6,] . . .
[7,] . . .
[8,] . . .
[9,] . . .
[10,] . . .
[11,] . . .
[12,] . . .
[13,] . . .
[14,] 24 24 26
[15,] . . .
[16,] 16 . .
,
我想obs.size
是您的清单。用稀疏矩阵表示sparseMatrix
包中的Matrix
。您需要提供i,j索引以及非零条目的值。
对于我来说,这是因为行索引:
nonzero = sapply(obs.size,length)
i = rep(1:length(obs.size),nonzero)
i
[1] 5 5 14 14 14 16
j是列索引,我的大脑现在无法正常工作,因此下面的代码可能会辅助:
j = unlist(tapply(i,i,seq_along))
然后创建矩阵:
library(Matrix)
sparseMatrix(i=i,j=j,x=unlist(obs.size))
16 x 3 sparse Matrix of class "dgCMatrix"
[1,] 16 . .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。