2012-01-20 12 views
4
zone_id=1:6 
v1=c(12,22,31,12,5,17) 
v2=c(15,22,28,16,18,21) 
v3=c(18,10,14,9,10,17) 
v4=c(20,3,2,5,12,21) 
mydata=data.frame(zone_id,v1,v2,v3,v4) 

データフレームは、上記のコードを使用して作成することができます。地理的エリアに関連するデータの行から構成されます。私は、これらの分野での観測である整数を含む変数(この例では4つ、実際のデータセットでは69)を持っています。 各zone_idについて、最大値を含むV1からV4までの変数を識別したいとします。ネクタイがある場合、私は束縛された最大値を含む各変数の名前を返したいと思います。したがって、ゾーン1ではV4を返したい、ゾーン2ではV1とV2などを返したい。データフレーム内のすべての変数に最大値を含む列を返す

私はRに非常に慣れており、これで最初の基礎を得ることができませんでした。私はRのヘルプファイルを調べて、スイープを使った解決法があるかもしれないと考えましたか?どんな助けもありがたい。

答えて

2

rankを使用する方法があります。デフォルトの順序は、低>高

x <- apply(-mydata[,-1],1,rank,ties.method="min") 
x 
    [,1] [,2] [,3] [,4] [,5] [,6] 
v1 4 1 1 2 4 3 
v2 3 1 2 1 1 1 
v3 2 3 3 3 3 3 
v4 1 4 4 4 2 1 

であり、あなたがsapplyと名を抽出でき、データの前にマイナス記号に注意してください。

sapply(mydata$zone_id,function(y) rownames(x)[x[,y]==1]) 
[[1]] 
[1] "v4" 

[[2]] 
[1] "v1" "v2" 

[[3]] 
[1] "v1" 

[[4]] 
[1] "v2" 

[[5]] 
[1] "v2" 

[[6]] 
[1] "v2" "v4" 
3

あなたがここにwhich(x == max(x))イディオムを使用してにapply()を使用することができます各行に対してこれを実行します。

apply(mydata[, -1], 1, function(x) which(x == max(x))) 

与える:

> apply(mydata[, -1], 1, function(x) which(x == max(x))) 
[[1]] 
v4 
4 

[[2]] 
v1 v2 
1 2 

[[3]] 
v1 
1 

[[4]] 
v2 
2 

[[5]] 
v2 
2 

[[6]] 
v2 v4 
2 4 

リストは最大である変数(S)のインデックスのベクトルを含んでおり、これらのベクトルの名前は、実際の変数ID与えることnames()を使用して抽出することができます:あなたのデータならば

> out <- apply(mydata[, -1], 1, function(x) which(x == max(x))) 
> names(out[[2]]) 
[1] "v1" "v2" 
> lapply(out, names) 
[[1]] 
[1] "v4" 

[[2]] 
[1] "v1" "v2" 

[[3]] 
[1] "v1" 

[[4]] 
[1] "v2" 

[[5]] 
[1] "v2" 

[[6]] 
[1] "v2" "v4" 

NAが含まれている可能性があります。ちょっとした工夫が必要です

apply(mydata[, -1], 1, 
     function(x, na.rm = FALSE) 
      which(x == max(x, na.rm = na.rm)), 
     na.rm = TRUE) 

ここでは、NAを無視するかどうかを渡すことができます。

+0

私にはwhich(x == max(x))と同等のwhich.max関数があると思います。これはコードをさらに短くすることになります。 –

+0

@PaulHiemstraあなたはhttp://codegolf.stackexchange.com/をよく知っていますか? :) –

+1

@PaulHiemstra私が 'which.max()'と一緒に行かなかった理由は、結びついた最大値があればOPはすべてのインデックスを返すことを望んでいたからです。 'which.max()'は遭遇した最初の**最大値を返します。これは、それと 'which(x == max(x))'バージョンが異なるところです。厳密に言うと、 'which.max(x)'は 'x 'に結びついていない' which(x == max(x)) 'に相当する* only *です。 –