将 NA 移动到矩阵中每一列的开头

Move NA to the start of each column in a matrix

我有一个包含如下数据的矩阵:

col1 col2 col3 col4 col5
2    3    2    8    3
7    1    0    4    NA
5    8    1    NA   NA
9    6    NA   NA   NA
4    NA   NA   NA   NA

我想将数据重新排列为以下结果,基本上是将 NA 移动到每列的顶部:

col1 col2 col3 col4 col5
2    NA   NA   NA   NA
7    3    NA   NA   NA
5    1    2    NA   NA
9    8    0    8    NA
4    6    1    4    3

如您所见,新数据的排序向量基于此排序矩阵:

col1 col2 col3 col4 col5
1    5    4    3    2
2    1    5    4    3
3    2    1    5    4 
4    3    2    1    5 
5    4    3    2    1

我认为最好的方法是将排序矩阵应用于原始矩阵,因此 col1 排序向量排序 col1,col2 排序向量排序 col2,依此类推。

使用此数据

your_matrix = structure(c(2L, 7L, 5L, 9L, 4L, 3L, 1L, 8L, 6L, NA, 2L, 0L, 1L, 
NA, NA, 8L, 4L, NA, NA, NA, 3L, NA, NA, NA, NA), .Dim = c(5L, 
5L), .Dimnames = list(NULL, c("col1", "col2", "col3", "col4", 
"col5")))

your_matrix
#      col1 col2 col3 col4 col5
# [1,]    2    3    2    8    3
# [2,]    7    1    0    4   NA
# [3,]    5    8    1   NA   NA
# [4,]    9    6   NA   NA   NA
# [5,]    4   NA   NA   NA   NA

我们可以应用一个排序函数,将 NAs 移动到末尾:

apply(your_matrix, MARGIN = 2, FUN = function(x) x[order(!is.na(x))])
#      col1 col2 col3 col4 col5
# [1,]    2   NA   NA   NA   NA
# [2,]    7    3   NA   NA   NA
# [3,]    5    1    2   NA   NA
# [4,]    9    8    0    8   NA
# [5,]    4    6    1    4    3