2016-09-01 41 views
3

NAsを無視しながら、行列row-maximaの列を探しています。であり、例えば、NAを削除したmax.col

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 

行の最大値と、NASを無視は、maxを使用して得ることができる。

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

Iは、これらの最大値の列の位置を探していただし、max.colは、NAsのない行に対してのみ機能します。

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

いくつか欠損値のない行の(最大)マキシマイザの列を見つける方法はありますか?すなわち、のようなもの:

[1] 2 2 3 1 NA 

答えて

3

私たちは、 'A' に-Infと 'NA' をreplaceし、その上max.colを適用します。

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

ただし、すべてのNAsを持つ最後の行は1になります。 NAを返すには、論理行列(!is.na(a))の否定変換されたNA(!rowSumsでNAを掛けることができます。

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

EDIT:OPはapplyを使用していたとしてwhich.maxは、列のインデックス

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

を返すことができ、フランクさんのコメント


@に基づいて0から-Infにreplaceメントを変更または

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

私は編集後最初のオプションを最も透過的にupvoteします。 – user3605620

+0

@ user3605620どこに変更しますか?私はすでにフランクのコメントに基づいて変更を加えました。 – akrun

関連する問題