我有一个大矩阵,我想从中随机提取一个较小的矩阵。 (我想这样做1000次,所以最终它会在for循环中。)比如说我有这个9x9矩阵:
mat=matrix(c(0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,
0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,
1,0,1,0,0,0,0,0,1,0,1,0,0,0,1), nrow=9)
从这个矩阵中,我想要一个随机的3x3子集。诀窍是我不希望最终矩阵中的任何行或列总和为0.另一个重要的是我需要知道最终矩阵中行和列的原始数量。因此,如果我最终随机选择第4,5和7行以及第1,3和8列,我希望在最终矩阵中可以轻松访问这些标识符。
这是我到目前为止所做的。
首先,我创建一个行号和列号的向量。我试图将这些附加到矩阵中。
r.num<-seq(from=1,to=nrow(mat),by=1) #vector of row numbers
c.num<-seq(from=0, to=(ncol(mat)+1),by=1) #vector of col numbers (adj for r.num)
mat.1<-cbind(r.num,mat)
mat.2<-rbind(c.num,mat.1)
现在我有一个带标识符的10x10矩阵。我可以通过创建随机向量并对矩阵进行子集来选择我的行。
rand <- sample(r.num,3)
temp1 <- rbind(mat.2[1,],mat.2[rand,]) #keep the identifier row
这很好用!现在我想随机选择3列。这是我遇到麻烦的地方。我尝试过同样的方式。
rand2 <- sample(c.num,3)
temp2 <- cbind(temp1[,1],temp1[,rand2])
问题是我最终得到了一些0的行和列和。我可以先消除总和为0的列。
temp3 <- temp1[,which(colSums(temp1[2:nrow(temp1),])>0)]
cols <- which(colSums(temp1[2:nrow(temp1),2:ncol(temp1)])>0)
rand3 <- sample(cols,3)
temp4 <- cbind(temp3[,1],temp3[,rand3])
但我最终收到了一条错误消息。出于某种原因,R不喜欢以这种方式对矩阵进行子集化。
所以我的问题是,有没有更好的方法在删除零列之后用随机向量“rand3”对矩阵进行子集化或者有更好的方法来随机选择三个互补的行和列,这样就没有了总和为0?
非常感谢你的帮助!
答案 0 :(得分:4)
如果我理解你的问题,我认为这会奏效:
mat=matrix(c(0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,
0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,0,
1,0,1,0,0,0,0,0,1,0,1,0,0,0,1), nrow=9)
smallmatrix = matrix(0,,nrow=3,ncol=3)
while(any(apply(smallmatrix,2,sum) ==0) | any(apply(smallmatrix,1,sum) ==0)){
cols = sample(ncol(mat),3)
rows= sample(nrow(mat),3)
smallmatrix = mat[rows,cols]
}
colnames(smallmatrix) = cols
rownames(smallmatrix) = rows