矩阵和向量随机选择n行,不重复

时间:2014-09-08 17:26:38

标签: r

我有一个垫子(1e6,34)和一个矢量vt(1e6)。我想得到一个mat2(1000,34)和一个向量vt2(1000),其中1000行是从原始矩阵中随机取出的。

我认为在R中这很容易,但我还没有找到解决方案。

我能做到

mat2 <- matrix(,ncol=34,nrow=1)
vt2 <- matrix(,ncol=1,nrow=1)
for (i in 1:1000) {
  i <- sample(1:1e6, 1)
  mat2 <- rbind(mat2,mat[i,])
  vt2 <- rbind(vt2,vt[i])
}
mat2 <- mat2[-1,]
vt2 <- vt2[-1,]

但是我相信它可以用更少的行来完成,而且这并不能确保我不会重复行。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

也许我在你的问题中遗漏了一些东西,但这会有用吗?

sampleSubset<-sample(1:1e6, 1000) #defaults to replace = FALSE
mat2<-mat[sampleSubset, ]    #take the randomly selected rows
vect2<-vect[sampleSubset]    #take the corresponding vector entries 

答案 1 :(得分:1)

假设一个名为&#34; mat&#34; (ncol = 34nrow = 1e6),你应该能够做你想做的事情:

mat[sample(1e6, 1000, FALSE), ]

您的矢量可以采用类似的方法,&#34; vt&#34;长度为1e6:

vt[sample(1e6, 1000, FALSE)]

当然,如果您希望行的相同索引提取要提取的向量位置,请执行以下操作之一:

  • sample(1e6, 1000, FALSE)的结果存储为单独的向量,并将其用于子集。
  • 在每次致电set.seed(your-favorite-or-most-random-number)之前使用sample,当然,每次都使用相同的种子。