我在下面的r中有一个矩阵。行中的值将根据行号重复。
format: 'MM/DD/YYYY
如何重新排列上面的矩阵,使其成为
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
答案 0 :(得分:3)
我们可以使用apply
和MARGIN=1
循环遍历矩阵的行,将每行中的元素子集化为非零(' x1')和零元素( ' x2'),创建一个按' x1'分组的序列。元素ave
,然后是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))