我有一个矩阵,其数据如下:
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}},因为他们没有足够数量的可用点,他们只会使用数据中可用的任何内容。
答案 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