在r中创建一个稀疏矩阵,每行有一组整数值

问题描述 投票:1回答:2

我正在尝试创建一个稀疏矩阵,其中每行最多有n个条目,每个条目都是一定范围内的整数,然后我可以将其用作社交网络分析的邻接矩阵。例如,一个80X80矩阵,其中每行有10个或更少的条目,这些条目是1-4的整数。目标是表示您从社交网络调查中获得的数据类型,其中受访者选择1到4之间的值来表明他们与调查中最多10个可能性/列的关系。

我可以使用“rsparsematrix”函数创建稀疏矩阵,并且使用密度命令可以近似所需的响应数量,但我无法控制每行的响应数量,并且必须进行额外的处理才能转换随机值在我想要的范围内的整数。

例如:我可以从类似的东西开始

M1<-rsparsematrix(80, 80, density = .1, symmetric = FALSE)

更有希望的方法(来自https://www.r-bloggers.com/casting-a-wide-and-sparse-matrix-in-r/)将生成值,然后使用“transform”将它们转换为矩阵。这允许我控制整数值,但仍然不能获得每行有限数量的响应。

博客中的示例代码如下:

set.seed(11)

 N = 10
data = data.frame(
row = sample(1:3, N, replace = TRUE),
col = sample(LETTERS, N, replace = TRUE),
value = sample(1:3, N, replace = TRUE))

data = transform(data,
              row = factor(row),
              col = factor(col))  "

这可以调整为给出所需的80x80矩阵,但是没有解决限制每行响应的问题,并且在相同行/列组合中重复条目的情况下将导致超出范围值,因为它解决了重复参加总和。

任何建议都将非常感激。

作为一个额外的问题,您将如何创建随机的空响应行?例如,在80 * 80矩阵内,您如何引入40个没有值的随机行?如在上面的描述中,这将对应于缺失的调查数据。

r random sparse-matrix adjacency-matrix
2个回答
0
投票

您可以尝试使用行(qazxsw poi),列(qazxsw poi)amd值(qazxsw poi)组件构建备用矩阵。这涉及根据行和值约束进行采样。

i

校验

j

请注意,不能像下面那样对列进行采样,因为这可以提供重复值,因此使用了循环。

x

0
投票

下面的代码将满足您的需求。它会生成随机稀疏矩阵,将其舍入为整数,然后对于每个有10个以上条目的行,随机生成一些条目# constraints values <- 1:4 maxValuesPerRow <- 10 nrow <- 80 ncol <- 80 # sample values : how many values should each row get but <= 10 values set.seed(1) nValuesForEachRow <- sample(maxValuesPerRow, nrow, replace=TRUE) # create matrix library(Matrix) i <- rep(seq_len(nrow), nValuesForEachRow) # row j <- unlist(lapply(nValuesForEachRow, sample, x=seq_len(ncol))) # which columns x <- sample(values, sum(nValuesForEachRow), replace=TRUE) # values sm <- sparseMatrix(i=i, j=j, x=x) ,直到只剩下10个。然后它使所有非dim(sm) table(rowSums(sm>0)) table(as.vector(sm)) 条目成为1到4之间的随机数。

j <- sample(seq_len(ncol), sum(nValuesForEachRow), replace=TRUE) 
© www.soinside.com 2019 - 2024. All rights reserved.