请考虑以下代码段:
>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)
你会怎么做?
永远不要调用变量T
.是的,这是一个有效的名字.是的,所有的代码应该使用TRUE
的布尔值,但有足够的代码片段,他们实际使用T
的TRUE
.你会破坏那些.
您可以使用以下功能:
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)
这似乎是理想的结果.