假设我们已生成矩阵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是这个问题的一部分 谢谢。
答案 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的列是正确的集合,上面的代码就可以了。