max.col删除NA

时间:2016-09-01 15:10:40

标签: r max na

我希望在忽略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

可以使用max

获取忽略NA的行最大值
> 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

1 个答案:

答案 0 :(得分:7)

我们replace&#39; NA&#39;使用-Inf进入&#39; a&#39;并对其应用max.col

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

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

v1 * NA^!rowSums(!is.na(a))
#[1]  2  2  3  1 NA

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

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

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