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

时间:2019-05-31 22:58:04

标签: r matrix triangular

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

a NA NA
b  d NA
c  e f

并将其转换为:

a d f
b e NA
c NA NA

这个想法是:移动每一列的值,直到第一个非NA值在第一行中

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

2 个答案:

答案 0 :(得分:2)

这是自定义功能的一种方式-

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 

答案 1 :(得分:0)

编辑::修复了不对值进行排序的问题:

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