combn(n,k) の組み合わせごとに除外された要素を取得する
-
21-09-2019 - |
質問
行列を生成したとします。 A
ここで、各列には次の組み合わせの 1 つが含まれます。 n
グループ内の要素 k
. 。したがって、その寸法は次のようになります。 k,choose(n,k)
. 。このような行列は、次のコマンドを与えて生成されます。 combn(n,k)
. 。私が取得したいのは別の行列です B
寸法付き (n-k),choose(n,k)
, 、各列は B[,j]
除外されたものが含まれます n-k
の要素 A[,j]
.
これはテーブルを取得する方法の例です B
. 。それは安全な方法だと思いますか?別の方法はありますか?
n <- 5 ; k <- 3
(A <- combn(n,k))
(B <- combn(n,n-k)[,choose(n,k):1])
もう一つの例
x<-c(0,1,0,2,0,1) ; k<- 4
(A <- combn(x,k))
(B <- combn(x,length(x)-k)[,choose(length(x),k):1])
それ 前の質問 私の考えもこの問題の一部です。
ありがとう。
解決
ムーサを使って アイデア
B <- apply(A,2,function(z) x[is.na(pmatch(x,z))])
最初の例に関しては:
B <- apply(A,2,function(z) (1:n)[is.na(pmatch((1:n),z))])
他のヒント
使用setdiff
機能:
N <- 5
m <- 2
A <- combn(N,m)
B <- apply(A,2,function(S) setdiff(1:N,S))
変形:上記の作品ベクトルが一意の値を持っているだけ。第二の例では、我々は、重複する値を扱うことができるsetdiff
の交換を記述します。私たちは、RLEを反転、その後、二組の各要素の出現回数をカウントするカウントを減算するrle
を使用します:
diffdup <- function(x,y){
rx <- do.call(data.frame,rle(sort(x)))
ry <- do.call(data.frame,rle(sort(y)))
m <- merge(rx,ry,by='values',all.x=TRUE)
m$lengths.y[is.na(m$lengths.y)] <- 0
rz <- list(values=m$values,lengths=m$lengths.x-m$lengths.y)
inverse.rle(rz)
}
x<-c(0,1,0,2,0,1) ; k<- 4
A <- combn(x,k)
B <- apply(A,2,function(z) diffdup(x,z))
ここでは、より一般的なソリューション(あなたは一意のエントリを含む任意のベクターでX
を置き換えることができます):
X<-1:n
B<-apply(A,2,function(x,ref) ref[!ref%in%x],ref=X)
B<-do.call(cbind,B)
X以前の問題の一方、yはAの列が適切なセットである、上記のコードが動作する必要があることを提供セットはなかった。
所属していません StackOverflow