我有一个大的500x53380的稀疏矩阵,想将其二分化。我尝试使用sna包中的“event2dichot”,但没有成功,因为它需要邻接矩阵或网络对象。
我还尝试编写了一个简单的算法:
for ( i in 1:500)
for (j in 1:53380)
if (matrix[i,j]>0) matrix[i,j]=1
这似乎是有效的,但由于矩阵非常大,至少需要几个小时,迄今为止仍在计算中,因此我正在寻求帮助!
您知道完成此任务的更好方法或技巧吗?
谢谢大家。
我有一个大的500x53380的稀疏矩阵,想将其二分化。我尝试使用sna包中的“event2dichot”,但没有成功,因为它需要邻接矩阵或网络对象。
我还尝试编写了一个简单的算法:
for ( i in 1:500)
for (j in 1:53380)
if (matrix[i,j]>0) matrix[i,j]=1
这似乎是有效的,但由于矩阵非常大,至少需要几个小时,迄今为止仍在计算中,因此我正在寻求帮助!
您知道完成此任务的更好方法或技巧吗?
谢谢大家。
mr <- 5
mc <- 8
mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] -1.477 1.773 1.630 -0.152 1.054 0.057 -1.260 0.999
[2,] -1.863 -0.312 -0.221 -0.102 0.892 -1.255 0.996 -0.193
[3,] -0.364 -0.059 2.317 1.156 0.893 0.225 0.392 -1.986
[4,] -1.123 -0.661 0.070 0.032 0.019 -1.763 -0.205 0.951
[5,] -0.111 -3.112 -0.970 -0.794 -1.372 -0.119 1.291 -0.680
mydim <- dim(mat)
mat[mat>0] <- 1
mat[mat<0] <- 0
dim(mat) <- mydim
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 1 1 0 1 1 0 1
[2,] 0 0 0 0 1 0 1 0
[3,] 0 0 1 1 1 1 1 0
[4,] 0 0 1 1 1 0 0 1
[5,] 0 0 0 0 0 0 1 0
mr <- 500
mc <- 53380
system.time({
mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
mydim <- dim(mat)
mat[mat>0] <- 1
mat[mat<0] <- 0
dim(mat) <- mydim
})
user system elapsed
12.25 0.42 12.88
思考向量化,只使用索引。例如:
mat <- matrix(0, nrow = 500, ncol = 53380)
set.seed(7)
fill <- sample(500*53380, 10000)
mat[fill] <- sample(fill, 1:10, replace = TRUE)
可以使用以下方法进行离散化:
mat[mat > 0] <- 1
在我的工作站上非常快:
> system.time(mat[mat > 0] <- 1)
user system elapsed
1.680 0.166 1.875
colSums()
将是我的首选。阅读 ?colSums
. - Gavin SimpsonMat@x
作为向量进行运算。例如:ix_low <- (Mat@x < threshold)
,然后Mat@x[ix_low] = 0, Mat@x[!ix_low] = 1
。