首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取每个combn(n,k)组合的排除元素

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

Stack Overflow用户
提问于 2010-03-22 16:49:55
回答 3查看 1.1K关注 0票数 2

假设我们生成了一个矩阵A,其中每一列都包含k组中的n元素的组合之一。因此,它的维度将是k,choose(n,k)。这样一个矩阵就是给出命令combn(n,k)生成的。我想得到的是另一个维度为(n-k),choose(n,k)的矩阵B,其中每一列B[,j]都将包含A[,j]中排除的n-k元素。

下面是一个获取表B的方法的示例。你认为这是一种安全的方法吗?还有别的办法吗?

代码语言:javascript
复制
n <- 5 ; k <- 3
(A <- combn(n,k))
(B <- combn(n,n-k)[,choose(n,k):1])

另一个例子

代码语言:javascript
复制
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就是这个问题的一部分。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-22 18:35:01

使用穆萨的idea

代码语言:javascript
复制
B <- apply(A,2,function(z) x[is.na(pmatch(x,z))])

关于第一个例子:

代码语言:javascript
复制
B <- apply(A,2,function(z) (1:n)[is.na(pmatch((1:n),z))])
票数 4
EN

Stack Overflow用户

发布于 2010-03-24 22:24:45

使用setdiff函数:

代码语言:javascript
复制
N <- 5
m <- 2    
A <- combn(N,m)
B <- apply(A,2,function(S) setdiff(1:N,S))

MODIFIED:仅当向量具有唯一值时,上述方法才有效。对于第二个示例,我们编写了一个可以处理重复值的setdiff的替代品。我们使用rle来计算两个集合中每个元素的出现次数,减去计数,然后反转RLE:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-03-22 17:12:06

这里有一个更通用的解决方案(您可以用任何包含唯一条目的向量替换X ):

代码语言:javascript
复制
X<-1:n
B<-apply(A,2,function(x,ref) ref[!ref%in%x],ref=X)
B<-do.call(cbind,B)

在您之前的问题x和y不是集合的情况下,如果A的列是适当的集合,则上面的代码应该可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2490860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档