我现在已经在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个地点,但不能两次选择相同的地点。
答案 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
个选择,并且不会多次选择任何输入行。