質問

行列を生成したとします。 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の列が適切なセットである、上記のコードが動作する必要があることを提供セットはなかった。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top