max.col删除NA

dze*_*zer 6 r max na

我想找到矩阵行最大值的列而忽略NA.例如,

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

那是:

> 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
Run Code Online (Sandbox Code Playgroud)

可以使用max以下方法获得忽略NA的行最大值:

> apply(a, 1, max, na.rm=T)
[1] 0.898 0.945 0.687 0.908  -Inf
Run Code Online (Sandbox Code Playgroud)

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

> max.col(a, ties.method="first")
[1] NA NA  3  1 NA
Run Code Online (Sandbox Code Playgroud)

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

[1]  2  2  3  1 NA
Run Code Online (Sandbox Code Playgroud)

akr*_*run 8

我们在'a replace'中使用'NA' -Inf并应用max.col它.

v1 <- max.col(replace(a, is.na(a), -Inf), ties.method="first")
Run Code Online (Sandbox Code Playgroud)

但是,对于具有所有NA的最后一行,这将返回1.要返回NA,我们可以将它与NA转换为逻辑矩阵()的否定(!)相乘.rowSums!is.na(a)

v1 * NA^!rowSums(!is.na(a))
#[1]  2  2  3  1 NA
Run Code Online (Sandbox Code Playgroud)

编辑:replace根据@Frank的评论将小调从0 更改为-Inf


由于OP正在使用apply,which.max可以返回列索引

apply(a, 1, function(x) which.max(x)[1])
#[1]  2  2  3  1 NA
Run Code Online (Sandbox Code Playgroud)

要么

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