假设我们生成了一个矩阵A,其中每一列都包含k组中的n元素的组合之一。因此,它的维度将是k,choose(n,k)。这样一个矩阵就是给出命令combn(n,k)生成的。我想得到的是另一个维度为(n-k),choose(n,k)的矩阵B,其中每一列B[,j]都将包含A[,j]中排除的n-k元素。
下面是一个获取表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就是这个问题的一部分。
谢谢。
发布于 2010-03-22 18:35:01
使用穆萨的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))])发布于 2010-03-24 22:24:45
使用setdiff函数:
N <- 5
m <- 2
A <- combn(N,m)
B <- apply(A,2,function(S) setdiff(1:N,S))MODIFIED:仅当向量具有唯一值时,上述方法才有效。对于第二个示例,我们编写了一个可以处理重复值的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-22 17:12:06
这里有一个更通用的解决方案(您可以用任何包含唯一条目的向量替换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的列是适当的集合,则上面的代码应该可以工作。
https://stackoverflow.com/questions/2490860
复制相似问题