假设我们已经产生了一个矩阵 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])

前一个问题 我的一部分,这个问题。
谢谢你。

有帮助吗?

解决方案

使用Musa' 想法

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

其他提示

使用setdiff功能:

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

修改:仅将上述作品当载体具有唯一值。对于第二个例子中,我们写setdiff可以处理重复值的替代品。我们使用rle计数在两组各元素的occurence的数量,减计数,然后倒置的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))

下面的更通用的解决方案(可以通过含有独特条目的任何矢量替换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的列是适当的套,上述代码应工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top