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

时间:2016-01-17 20:21:58

标签: 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)

产生以下

     [,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的列可以保持不变。

一个完整的解决方案会很棒,但我可以获得有关如何进行此类复杂重组的提示。

1 个答案:

答案 0 :(得分:5)

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

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