如何向上移动R中矩阵中每一列的值

How to move up the values of each column in a matrix in R

我正在寻找一种通用方法来执行以下操作, 我有一个nxn的三角矩阵,例如:

a NA NA
b  d NA
c  e f

并将其转换为:

a d f
b e NA
c NA NA

想法是:为每一列移动值,直到第一个非 NA 值位于第一行

我想它是用一个 for 完成的,对于每一列,所以它会上升,但我不知道怎么做...

这里有一个自定义函数的方法 -

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

custom_shift <- function(x) {
  y <- x[!is.na(x)]
  length(y) <- length(x)
  y
}

apply(m, 2, function(a) custom_shift(a))

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA 

编辑: 修正为不对值进行排序:

apply(m, 2, function(x) x[order(is.na(x))])

原文:另一个使用sort(..., na.last = T)的解决方案,如果你需要对每一列进行排序,这是很好的:

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
                                                                     3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

apply(m, 2, sort, na.last = T )

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA