矩阵中的随机样本值,在R中没有替换

时间:2015-12-27 01:25:05

标签: r matrix sample random-sample

我现在已经在Stack Overflow上搜索了大约45分钟,所以如果这个问题确实已经发布了 - 我很抱歉!

例如,我说我有一个6行3列的小矩阵,我需要随机选择值:每列2个值。

             Feb    Mar    Apr
Mt_Rainier   220.0  200.0  130.0
Vancouver    104.6  113.9  88.5
Neah_Bay     226.0  206.0  134.0
Portland     94.0   94.0   68.6
Olympic_Park 53.3   66.0   45.7
Orcas_Island 71.0   61.0   48.0

换句话说,我需要为每个月选择2个地点,但不能两次选择相同的地点。

2 个答案:

答案 0 :(得分:0)

您希望结果看起来是什么样的(确切)?您是否希望从矩阵的每列中采样?如果是这样,请尝试:

c(                               ## collapse matrix result to a vector
   apply(m,MARGIN=2,FUN=sample,  ## sample from each column
     size=2,replace=FALSE        ## additional arguments to sample()
   )
  )

答案 1 :(得分:0)

n作为每列选择的值的数量,您可以构造一个带有n*ncol(m)行的索引矩阵,其中行索引在不替换可用行范围的情况下进行采样,并且列索引按常规顺序指定,每个列出n次:

set.seed(1L);
m <- matrix(c(220.0,104.6,226.0,94.0,53.3,71.0,200.0,113.9,206.0,94.0,66.0,61.0,130.0,88.5,134.0,68.6,45.7,48.0),6,dimnames=list(c('Mt_Rainier','Vancouver','Neah_Bay','Portland','Olympic_Park','Orcas_Island'),c('Feb','Mar','Apr')));
n <- 2L;
im <- matrix(c(sample(nrow(m),n*ncol(m)),rep(seq_len(ncol(m)),each=n)),ncol=2L);
im;
##      [,1] [,2]
## [1,]    2    1
## [2,]    6    1
## [3,]    3    2
## [4,]    4    2
## [5,]    1    3
## [6,]    5    3
m[im];
## [1] 104.6  71.0 206.0  94.0 130.0  45.7
rownames(m)[im[,1L]];
## [1] "Vancouver"    "Orcas_Island" "Neah_Bay"     "Portland"     "Mt_Rainier"   "Olympic_Park"

这可确保每个输入列获得完全n个选择,并且不会多次选择任何输入行。