巧妙地重新排序R中此结构化矩阵的条目?

use*_*035 2 r

请考虑以下代码段:

>k<-5
>T<-t(combn(k+1,k))
>T
   [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    6
[3,]    1    2    3    5    6
[4,]    1    2    4    5    6
[5,]    1    3    4    5    6
[6,]    2    3    4    5    6
Run Code Online (Sandbox Code Playgroud)

除了第一线,每条线 T[i,]T具有k元件,k-1其中与常见的T[i-1,].

我想重新排序给定行中的条目,以便T[i,], i>1每行上的"新"条目放在最后一列中.

即我希望重新排序的表看起来像:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    6
[3,]    1    2    3    6    5
[4,]    1    2    6    5    4
[5,]    1    6    4    5    3
[6,]    6    3    4    5    2
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Jor*_*eys 6

永远不要调用变量T.是的,这是一个有效的名字.是的,所有的代码应该使用TRUE的布尔值,但有足够的代码片段,他们实际使用TTRUE.你会破坏那些.

您可以使用以下功能:

new.order <- function(x){
    comp <- function(a,b){
        id <- which(match(a,b,0L)==0)
        if(id!=nc){
          b[nc] <- b[id]
          b[id] <- a[nc]
        }
        b
    }
    nr <- nrow(x)
    nc <- ncol(x)
    xlist <- lapply(seq_len(nr),function(i) x[i,])
    out <- mapply(comp,xlist[-nr],xlist[-1],SIMPLIFY=FALSE)
    do.call(rbind,c(xlist[1],out))
}
Run Code Online (Sandbox Code Playgroud)

如有必要,内部函数comp将替换已更改的元素.main函数使用lapply使矩阵成为行列表,然后使用mapply对所有行进行匹配.最后(但并非最不重要),你将所有东西联系在一起.

这给了

> k<-5

> myT<-t(combn(k+1,k))

> myT
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    6
[3,]    1    2    3    5    6
[4,]    1    2    4    5    6
[5,]    1    3    4    5    6
[6,]    2    3    4    5    6

> new.order(myT)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    6
[3,]    1    2    3    6    5
[4,]    1    2    6    5    4
[5,]    1    6    4    5    3
[6,]    6    3    4    5    2
Run Code Online (Sandbox Code Playgroud)

这似乎是理想的结果.

  • @CarlWitthoft你有更多的机会通过避免转换到列表并返回到矩阵来优化它,但是它不太容易推广并且需要相当多的索引魔法.尝试在两个矩阵上调用match()并使用生成的矩阵作为向量.通过智能地使用索引模式,您应该能够加快速度.我把它作为练习留给读者:) (2认同)