繰り返しを許さないリサンプリング

Rで繰り返しを許さないリサンプリングを行う際に使うよう関数

comb.no(rep(0,z),x)

の形で使う。z>=xでzが母集団の数、xがリサンプリング数。
返し値はリサンプリングする場所をリサンプリングの順番であらわす。
0の場所はリサンプリングされない場所。

comb.no <- function(n,x){
	zero.no <- length(n[n==0])
	n[n==0][trunc(runif(1,min=1,max=zero.no+1))] <- x
	x <- x-1
	if(x>0){
		comb.no(n,x)
	}else{
		n
	}
}

例えば

comb.no(rep(0,20),5)

の返し値は

 0 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 2 0

といった感じになる。

今やっている計算に使いがてら、Rにおける再帰の練習に。