r中的矩阵重排与重组

r中的矩阵重排与重组,r,R,我在下面的r中有一个矩阵。根据行号重复行中的值 a1 a2 a3 0 0 0 0 0 0 a1 a1 a2 a2 a3 a3 0 0 0 a1 a1 a1 a2 a2 a2 a3 a3 a3 如何重新排列上述矩阵,使其成为 a1 a2 a3 0 0 0 0 0 0 a1 a2 a3 a1 a2 a3 0 0 0 a1 a2 a3 a1 a2 a3 a1 a2 a3 我们

我在下面的r中有一个矩阵。根据行号重复行中的值

a1  a2  a3  0   0   0   0   0   0
a1  a1  a2  a2  a3  a3  0   0   0
a1  a1  a1  a2  a2  a2  a3  a3  a3
如何重新排列上述矩阵,使其成为

a1  a2  a3  0   0   0   0   0   0
a1  a2  a3  a1  a2  a3  0   0   0
a1  a2  a3  a1  a2  a3  a1  a2  a3

我们可以使用
apply
MARGIN=1
循环遍历矩阵的行,将每行中的元素子集为非零('x1')和零元素('x2'),创建一个序列,该序列由具有
ave
的“x1”元素分组,然后根据获得的序列对“x1”进行排序,连接(
c
)使用向量中的零元素,转置(
t
)以获得输出

 t(apply(m1, 1, function(x) {
      x1 <- x[x!=0]
      x2 <- x[x==0]
      c(x1[order(as.numeric(ave(x1, x1, FUN=seq_along)))], x2)}))
#   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#[1,] "a1" "a2" "a3" "0"  "0"  "0"  "0"  "0"  "0" 
#[2,] "a1" "a2" "a3" "a1" "a2" "a3" "0"  "0"  "0" 
#[3,] "a1" "a2" "a3" "a1" "a2" "a3" "a1" "a2" "a3"
t(应用(m1,1,函数(x){

x1谢谢,我正在尝试根据位置重新排列,值中没有顺序,而是基于位置的顺序。例如,在第2行中,
a2
偏移了-1,+1。
a3
偏移了-2,0。在第3行中,
a2
偏移了-2,0,+2,
a3
偏移了-4,-2,0。@HaagenDaz我不确定是否理解您的命令我的解决方案基于您共享的示例。
m1 <- structure(c("a1", "a1", "a1", "a2", "a1", "a1",
"a3", "a2", "a1", 
"0", "a2", "a2", "0", "a3", "a2", "0", "a3", "a2", "0", "0", 
"a3", "0", "0", "a3", "0", "0", "a3"), .Dim = c(3L, 9L))