r - 选择由 R 中的随机向量指定的列

标签 r matrix subset random-sample

我有一个大矩阵,我想从中随机提取一个较小的矩阵。 (我想这样做 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?

非常感谢你的帮助!

最佳答案

如果我理解你的问题,我认为这会奏效:

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

关于r - 选择由 R 中的随机向量指定的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344749/

相关文章:

python - 如何忽略日期不在 pandas 索引中的错误?

python - 检查一组字母是否可以组成一个单词(考虑字母可以使用的次数)?

R创建列组合来自两列的信息

r - 从 R 脚本到 Power Bi - 如何使用 setdiff

r - 整理 R 数据框中的数字数组

c - 将 3D Matlab 矩阵作为 1D 写入文件并用 C 读回

r - 从原始矩阵中选择奇数行和奇数列

r - dplyr 自动断开 postgres 连接问题

javascript - 识别 Canvas 元素,分离矩阵中的元素

java - 尝试交换矩阵中的偶数/奇数行(Java)