R 重新排列矩阵:折叠列以删除NAs

R 重新排列矩阵:折叠列以删除NAs,r,matrix,R,Matrix,经过仔细的搜索,我仍然无法解决我的问题,它就在这里。 我有一个矩阵,其中有许多NAs,如下所示: matrix(c(NA,NA,1,NA,NA,-3, -1,NA,NA,NA,NA,NA, NA,2,NA,NA,NA,NA, NA,3,NA,NA,-2,5, NA,NA,NA,NA,NA,NA, NA,NA,NA,6,-7,NA),ncol=6,nrow = 6) 这会产生以下结果 [,1] [,2] [,3] [,4] [,5] [,6] [1,] NA -1

经过仔细的搜索,我仍然无法解决我的问题,它就在这里。 我有一个矩阵,其中有许多
NA
s,如下所示:

matrix(c(NA,NA,1,NA,NA,-3,  -1,NA,NA,NA,NA,NA,  NA,2,NA,NA,NA,NA,  NA,3,NA,NA,-2,5,  NA,NA,NA,NA,NA,NA,  NA,NA,NA,6,-7,NA),ncol=6,nrow = 6)
这会产生以下结果

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   -1   NA   NA   NA   NA
[2,]   NA   NA    2    3   NA   NA
[3,]    1   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA    6
[5,]   NA   NA   NA   -2   NA   -7
[6,]   -3   NA   NA    5   NA   NA
我的目标是将矩阵折叠为:1)将所有值向上移动以去除
NA
s而产生的行数;2) 列数相同。在这种情况下,生成的矩阵将为3X6,因为在任何情况下,每列的值都不会超过3个。 这是我试图获得的矩阵:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -1    2    3   NA    6
[2,]   -3   -1    2   -2   NA   -7
[3,]    1   -1    2    5   NA    6
1) 具有单个值的列重复此操作;2) 具有两个值的列在第二次出现时具有第二个值,而当它们出现第三个值时,它们将再次假定第一个值(并最终为其他行保留该值);3) 具有三个值的列每次都会更改它。包含所有
NA
s的列可以保持不变


一个完整的解决方案会很好,但我很乐意得到关于如何进行这种复杂重组的提示。

假设
m
是输入矩阵,找到任何列中非NAs的最大数量,然后将
rep_len
应用到每列中该长度的非NAs:

mx <- max(colSums(!is.na(m)))
apply(m, 2, function(x) rep_len(na.omit(x), mx))

作品优美,简单有效。太好了,谢谢你。
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -1    2    3   NA    6
[2,]   -3   -1    2   -2   NA   -7
[3,]    1   -1    2    5   NA    6