2

のグループ内の要素Aの組み合わせの 1 つが各列に含まれる行列を生成したとします。したがって、その寸法は になります。このような行列は、コマンド を与えることで生成されます。私が取得したいのは、次元を持つ別のマトリックスで、各列には の除外された要素が含まれます。 nkk,choose(n,k)combn(n,k)B(n-k),choose(n,k)B[,j]n-kA[,j]

get table を使用する方法の例を次に示します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])

私の以前の質問は、この問題の一部です。
ありがとうございました。

4

3 に答える 3

4

Musaのアイデアを使って

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))])
于 2010-03-22T10:35:01.157 に答える
2

setdiff関数を使用します。

N <- 5
m <- 2    
A <- combn(N,m)
B <- apply(A,2,function(S) setdiff(1:N,S))

変更: 上記は、ベクトルが一意の値を持つ場合にのみ機能します。setdiff2 番目の例では、重複する値を処理できるの置換を記述します。2 つのセット内の各要素の出現回数を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))
于 2010-03-24T14:24:44.830 に答える
1

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 の列が適切なセットであれば、上記のコードは機能するはずです。

于 2010-03-22T09:12:06.377 に答える