在 R 中对矩阵进行重新排列和重组

3
我有一个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
1个回答

4
我们可以使用MARGIN=1apply函数遍历矩阵的行,将每一行的元素分成非零('x1')和零元素('x2'),用ave创建以'x1'元素为组的序列,然后根据所得到的序列用order对'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"

数据

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

谢谢,我正在尝试根据位置重新排列,值之间没有顺序,但是根据位置有顺序。例如,在第二行,“a2”偏移了-1,+1。“a3”偏移了-2,0。在第三行,“a2”偏移了-2,0,+2,“a3”偏移了-4,-2,0。 - HaagenDaz
@HaagenDaz 我不确定我理解你的评论。我的解决方案是基于你分享的例子。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接