矩阵中的随机样本值无需在 R 中替换

Random sample values in a matrix without replacement in R

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

例如,假设我有一个 6 行 3 列的小矩阵,我需要从中随机 select 值:每列 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

换句话说,我每个月需要 select 2 个地点,但不能 select 同一个地点两次。

您(确切地)希望结果看起来像什么?您要从矩阵的每一列中抽取 values 吗?如果是这样,请尝试:

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()
   )
  )

n为每列select的值个数,可以构造一个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 select 个离子,并且任何输入行都不会被 selected 多次。