2

假设我们已经生成了一个矩阵A,其中每列包含一组n元素的组合之一k。所以,它的尺寸将是k,choose(n,k)。产生这样的矩阵给出命令combn(n,k)。我想得到的是另一个B具有维度的矩阵(n-k),choose(n,k),其中每一列B[,j]将包含 的排除n-k元素A[,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

使用穆萨的想法

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

已修改:仅当向量具有唯一值时,上述方法才有效。对于第二个示例,我们编写了一个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))
于 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 回答