2016-11-18 12 views
1

상대적으로 높은 차원 (100X500000) 인 매트릭스 Q를 가지고 있으며이를 다운 샘플링하려고합니다. 다운 샘플링을 통해 예제로 설명하겠습니다.매트릭스를 R에서 다운 샘플링 R

하자 Q =

1 4 9 
3 2 1 

및 다운 샘플링 사이즈 = N. 저는 sum (Q) = 20 구슬의 항아리에서 n 구슬을 그려야합니다. 각 구슬은 행렬의 다른 색인 쌍에 해당하는 6 가지 방법 중 1 가지를 채색합니다. 마치 A 공 1 개, B 공 4 개 등등, 교체하지 않고 n 개의 공을 그린 것 같습니다.

행렬과 같은 형식으로 반환되기를 바랍니다. 이것에 문제가, 샘플 1 간주됩니다 그러나

sample(length(as.vector(Q)), size=n, replace=FALSE, prob = as.vector(Q)) 

: 길이 (한 예로 반환 값, 예를 들어, 다운 샘플링 (질문 3)

0 0 2 
1 0 0 

내 접근 방식은 샘플을 사용하려고 = as.vector (Q))를 가지고 있기 때문에 내 볼을 대체하지 않기 때문에 길이 (as.vector (Q)) 이상의 볼을 그릴 수 없습니다.

그래서 내 방법에 적응하려면이 벡터에서 1을 빼고 prob를 업데이트해야하며 일종의 for 루프를 사용하여 샘플을 하나씩 호출해야합니다. 좋은 코드처럼 들리지는 않습니다.

R- 친화적 인 방법으로 루프 방식을 사용하는 것이 더 좋은 방법이 있습니까?

답변

6

다소 비효율적이지만, sum(Q)이 아니더라도도 커지면 벡터를 분해/복제 한 다음 샘플링 한 다음 재 집성/도표화하여이를 수행 할 수 있습니다.

Q <- setNames(c(1,4,9,3,2,1),LETTERS[1:6]) 
n <- 10 
set.seed(101) 
s0 <- sample(rep(names(Q),Q), 
     size=n,replace=FALSE) 
Q2 <- table(factor(s0,levels=names(Q))) 
## A B C D E F 
## 1 2 5 1 0 1 

매트릭스 구조가 확실하지 않습니다. dim(Q2) <- dim(Q)을 사용하면 원래 매트릭스와 동일한 순서로 결과를 재구성 할 수 있습니다 ...

+0

위대한, 나는 이것을 시도 할 것이다. Fyi 나는 차원의 문자 b/c를 사용할 수 없지만 이름 = [1 : 길이 (as.vector (Q)] 만 사용합니다. – lynnyi

3

좋은 방법이 있습니다. which(x <= cq)[1]finding the first TRUE value에 특수 제작 된 함수로 대체하여 효율성을 향상시킬 수 있습니다 (필요한 경우).

Q = matrix(c(1, 4, 9, 3, 2, 1), nrow = 2) 

set.seed(47) 
samp = sample(sum(Q), size = 3) 
cq = cumsum(Q) 

inds = table(sapply(samp, function(x) which(x <= cq)[1])) 

result = integer(length(Q)) 
result[as.integer(names(inds))] = inds 
dim(result) = dim(Q) 
#  [,1] [,2] [,3] 
# [1,] 0 2 0 
# [2,] 0 0 1