我正在寻找一种通用的方法来执行以下操作, 我有一个nxn的三角矩阵,例如:
a NA NA
b d NA
c e f
并将其转换为:
a d f
b e NA
c NA NA
这个想法是:移动每一列的值,直到第一个非NA值在第一行中
我想对于每一列,它都是用for来完成的,所以它上升了,但是我不知道该怎么做...
答案 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