获取每个combn(n,k)组合的排除元素

时间:2010-03-22 08:49:55

标签: r combinations

假设我们已生成矩阵A,其中每列包含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])

我的previous question是这个问题的一部分 谢谢。

3 个答案:

答案 0 :(得分:4)

使用Musa的idea

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))])

答案 1 :(得分:2)

使用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))

答案 2 :(得分: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的列是正确的集合,上面的代码就可以了。