3

私の質問は簡単です。以下のデータの場合、

var1    var2    var3
10      40      60
15      10      5

との中でMaxValueVar最大値を持つ列のインデックスを返す新しい列を追加したいと考えています。つまり、以下のような表を作りたいのです。var1var2var3

var1    var2    var3    MaxValueVar
10      40      60      3
15      10      5       1

RI では次を使用します。

apply(vector, 1, which.max)

SASを使用してこれを達成するにはどうすればよいですか?

4

3 に答える 3

4

ここで提供するサンプルによると、参照用の 1 つのソリューション。ネクタイの扱い方については言及していませんでした。ここでは同点の場合、最初に出現したものがフェッチされます。

data test;
input var1 var2 var3;
datalines;
10      40      60
15      10      5
run;

data test;
 set test;
 maxvalue=max(of var1-var3);
 maxvaluevar=0;
  array vars (*) var1-var3;
    do i=1 to dim(vars);
     if maxvaluevar=0 then maxvaluevar=i*(maxvalue=vars(i))+maxvaluevar;
    end;
 drop i maxvalue;
run;
于 2012-04-04T06:42:25.170 に答える
2

これは、Robbie's のソリューションと同様のソリューションです。関数を使用してvname()、配列内のインデックスに加えて、最初の最大値の変数名を取得します。

data maxarr (drop=i);
input var1 var2 var3;
 array vars(*) var1-var3;
 max=max(of vars(*));
   do i=1 to dim(vars);
     if vars(i)=max then do;
          MaxValueIndx=i;
          MaxValueVar=vname(vars(i));
          leave;
     end;
   end;
datalines;
10      40      60
15      10      5
;
run;

proc print data=maxarr noobs;run;
于 2012-04-04T16:40:12.217 に答える
2

以下のコードは意図したとおりに機能し、同順位のインスタンスでより多くの列を作成する必要があります。気にするなと言ったのは知っていますが、それは私を悩ませていました!

入力テスト データ:

data test;
    input var1 var2 var3;
    cards;
10 40 60
15 10 5
7 8 9
13 13 10
5 7 6
10 11 12
10 10 10
1 3 2
3 3 1
;
run;

最大値を確認するコード:

data test (drop = i howmanymax);
    set test;
    retain howmanymax;

    howmanymax=0;

    array varlist[*] var1--var3;
    array maxnum[3];

    do i = 1 to DIM(varlist);
        if varlist[i] = max(of var1--var3)
            then do;
                howmanymax+1;
                maxnum[howmanymax] = i;
            end;
    end;

run;

出力は次のようになります。

  var1  var2  var3  nummax1 nummax2 nummax3
    10    40    60        3       .       .
    15    10     5        1       .       .
     7     8     9        3       .       .
    13    13    10        1       2       .
     5     7     6        2       .       .
    10    11    12        3       .       .
    10    10    10        1       2       3
     1     3     2        2       .       .
     3     3     1        1       2       .
于 2012-04-05T00:04:41.917 に答える