代码之家  ›  专栏  ›  技术社区  ›  Yorgos

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

  •  2
  • Yorgos  · 技术社区  · 16 年前

    假设我们已经生成了一个矩阵 A 其中每列包含 n 元素分组 k . 所以,它的尺寸是 k,choose(n,k) . 生成这样一个矩阵来给出命令 combn(n,k) . 我想要的是另一个矩阵 B 带尺寸 (n-k),choose(n,k) ,其中每个列 B[,j] 将包含排除的 n-k 要素 A[,j] .

    下面是一个我使用“获取表”的方法的示例 . 你认为这是一种安全的方法吗?还有别的办法吗?

    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 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    使用穆萨 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))])
    
        2
  •  2
  •   Jyotirmoy Bhattacharya    16 年前

    使用 setdiff 功能:

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

    修改:只有当向量具有唯一值时,上述方法才有效。对于第二个示例,我们编写了 塞特夫 可以处理重复值的。我们使用 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))
    
        3
  •  1
  •   teucer    16 年前

    这里有一个更通用的解决方案(您可以替换 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的列是正确的集合,那么上面的代码应该可以工作。