如何向上移动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
我正在寻找一种通用方法来执行以下操作, 我有一个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