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

000*_*484 4 r matrix

经过仔细搜索后,我仍然无法解决我的问题.我有一个矩阵,有很多NA像这样的矩阵:

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)
Run Code Online (Sandbox Code Playgroud)

产生以下内容

     [,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
Run Code Online (Sandbox Code Playgroud)

我的目标是将矩阵折叠为:1)将所有值向上移动以除去NAs 所产生的行数; 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
Run Code Online (Sandbox Code Playgroud)

1)具有单个值的列重复它; 2)具有两个值的列在第二次出现时具有第二个值,而当它们出现在第三个时,它们再次呈现第一个值(并最终为其他行保持它); 3)具有三个值的列每次都会改变它.包含所有NAs 的列可以保持不变.

一个完整的解决方案将是伟大的,但我很好地得到关于进行这种类型的复杂重组的方式的提示.

G. *_*eck 5

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

mx <- max(colSums(!is.na(m)))
apply(m, 2, function(x) rep_len(na.omit(x), mx))
Run Code Online (Sandbox Code Playgroud)

赠送:

     [,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
Run Code Online (Sandbox Code Playgroud)