我有一个巨大的稀疏全零,我想根据另一个matrix
的索引将其部分单元格替换为值1。请注意,不同的单元格将跨列替换,并提供indices
。我在样本数据上尝试了这个,而且速度很慢。我的真实数据有1E8行。感谢任何建议。
library(Matrix)
library(microbenchmark)
microbenchmark(
m1={
n_row <- 8000
n_col <- 5000
# create a sparse matrix
df <- Matrix(data=0, nrow=n_row, ncol=n_col, sparse=TRUE)
# define indices to be replaced
ind_replace <- data.frame(R1=c(4000, 5000), R2=c(1200, 3500), R3=c(7200, 7900))
for (kk in 1:ncol(ind_replace)){
df[ind_replace[1,kk]:ind_replace[2,kk], kk] <- 1
}
}
)
Unit: milliseconds
expr min lq mean median uq max neval
m1 18.48567 19.84298 22.48396 20.05846 20.48897 139.8459 100
答案 0 :(得分:1)
从R3 =c(7200,7900)
中排除ind_replace
后尝试此操作,因为您创建的矩阵中不存在这些列:
library(Matrix)
n_row <- 8000
n_col <- 5000
ind_replace = data.frame(R1=c(4000, 5000), R2=c(1200, 3500))
spmat<-Matrix(0,nrow = n_row ,ncol = n_col,sparse = T)
创建一个矩阵ind
,其中包含非零元素的行索引和列索引。
ind = apply(ind_replace,MARGIN = 2,function(t){data.frame(a= t[1]:t[2],b= t[1])})
ind = as.matrix(Reduce(function(x,y){rbind(x,y)},ind))
spmat[ind]=1