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 的评论replace
将 replace
ment 从 0 更改为 -Inf
由于 OP 使用 apply
,which.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
我正在寻找矩阵行最大值的列,同时忽略 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)
).
!
)rowSums
相乘
v1 * NA^!rowSums(!is.na(a))
#[1] 2 2 3 1 NA
编辑:根据@Frank 的评论replace
将 replace
ment 从 0 更改为 -Inf
由于 OP 使用 apply
,which.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