max.col 移除 NA

max.col with NA removal

我正在寻找矩阵行最大值的列,同时忽略 NA。例如,

set.seed(1)
a <- matrix(runif(15), ncol=3)
a[a<.3] <- NA
a[5,] <- NA

即:

> a
      [,1]  [,2]  [,3] 
[1,]    NA 0.898    NA 
[2,] 0.372 0.945    NA
[3,] 0.573 0.661 0.687
[4,] 0.908 0.629 0.384
[5,]    NA    NA    NA

忽略 NA 的行最大值可以使用 max:

获得
> apply(a, 1, max, na.rm=T)
[1] 0.898 0.945 0.687 0.908  -Inf

我正在寻找这些最大值的列位置,但 max.col 仅适用于没有任何 NA 的行。

> max.col(a, ties.method="first")
[1] NA NA  3  1 NA

我如何找到具有非缺失值的行的(第一个)最大化器的列?即,类似于:

[1]  2  2  3  1 NA

我们 replace 'NA' 和 'a' 中的 -Inf 并在其上应用 max.col

v1 <- max.col(replace(a, is.na(a), -Inf), ties.method="first")

但是,这将为所有 NA 的最后一行 return 1。对于return NA,我们可以将其与逻辑矩阵(!is.na(a)).

的NA转换后的取反(!)rowSums相乘
v1 * NA^!rowSums(!is.na(a))
#[1]  2  2  3  1 NA

编辑:根据@Frank 的评论replacereplacement 从 0 更改为 -Inf


由于 OP 使用 applywhich.max 可以 return 列索引

apply(a, 1, function(x) which.max(x)[1])
#[1]  2  2  3  1 NA

sapply(apply(a, 1, which.max), `length<-`, 1)
#[1]  2  2  3  1 NA