2013-10-02 2 views
1

각 행에서 무작위로 샘플링 된 행렬에서 샘플링 된 열을 결정하려고합니다. 함수 샘플에는 실제로 샘플링 된 위치를 알려주지 않는 것으로 보입니다. 이제 모든 값이 고유하면 단순한 매칭 루틴으로 문제를 해결할 수 있습니다. 그러나, 그들은 내 경우에 있지 않습니다, 그래서 이것은 작동하지 않습니다.R 샘플은 매트릭스?

x <- c(2,3,5,1,6,7,2,3,5,6,3,5) 
y <- matrix(x,ncol=4,nrow=3) 
random <- t(apply(y,1,sample,2,replace=FALSE)) 

원래 매트릭스의 반복 값

 [,1] [,2] 
[1,] 2 6 
[2,] 3 3 
[3,] 5 5 

[,1] [,2] [,3] [,4] 
[1,] 2 1 2 6 
[2,] 3 6 3 3 
[3,] 5 7 5 5 

임의의 Y, I는 말할 수없는 경우에는 임의의 [1,1] 1 열 또는 3 열에서 채취하여, 둘 다 값이 2이기 때문에 일치가 여기에서 작동하지 않습니다.

"random"행렬과 함께, 동일한 값의 행렬로 각 값이 샘플링 된 행렬을 제공하는 행렬을 원합니다. 예 :

 [,1] [,2] 
[1,] 1 4 
[2,] 1 3 
[3,] 3 4 

감사합니다.

답변

5

sample의 임의 선택을 별도로 저장해야 나중에 일치하는 것에 대해 걱정할 필요가 없습니다. 예를 들어, 다시 y를 사용하여 :

y 
#  [,1] [,2] [,3] [,4] 
#[1,] 2 1 2 6 
#[2,] 3 6 3 3 
#[3,] 5 7 5 5 

set.seed(42) 
randkey <- t(replicate(nrow(y),sample(1:ncol(y),2))) 
#  [,1] [,2] 
#[1,] 4 3 
#[2,] 2 3 
#[3,] 3 2 

random <- matrix(y[cbind(c(row(randkey)), c(randkey))], nrow(y)) 
#  [,1] [,2] 
#[1,] 6 2 
#[2,] 6 3 
#[3,] 5 7 
+1

@flodel을 - 감사 - 나는 당신의 코멘트를 편집했습니다 - 그것은 간단하고 거의 확실히 빠릅니다. – thelatemail

+0

+1. 속도가 중요하다면,'microbenchmark (sample (1 : 4,2), sample.int (4,2))'(후자는 약 절반의 시간 소요)를보십시오. – Frank

+0

내가 필요한 것. 정말 고맙습니다!!! – Nate