如何用R中不同的排序向量排列矩阵中的每一列?

时间:2015-12-21 18:59:23

标签: r

我有一个矩阵,其数据如下:

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,依此类推。

最终我只想让数字数据从底部开始排列。我需要这样做的原因是因为我想将colMeans应用于所有列,而不必按列指定不同的子集索引。

例如colMeans(mat[3:5, 1:2], na.rm=T)会产生6 7,但我想要的是6 5

或许我正在做的事情是毫无意义的。我的最终目标是在给定特定点数的情况下计算列的平均值。例如,col1的4个点的平均值为(7+5+9+4)/4 = 6.25,其中col2的4个点的平均值为(3+1+8+6)/4 = 4.5,最后col3 to col5的平均值为1, 6, 3将分别为{{1}},因为他们没有足够数量的可用点,他们只会使用数据中可用的任何内容。

1 个答案:

答案 0 :(得分:0)

使用此数据

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

我们可以应用一个将NA移到最后的排序函数:

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