1

私は取り組んでいるちょっとした問題を抱えており、近いと思いますが、タスクを完全に完了することはできません.

40 人の異なる人の値の 16 行/観察を含むデータセットがあります。私が計算したいのは、16 の観測値のそれぞれについて 2 つのスコアのうち高い方を採用した場合に、どのペアの人が最も高い値になるかということです。

data test; 
input A B C D; 
datalines; 
22.82 17.74 5.94 19
10.16 17.74 23.12 6.62
10.62 10.76 24.72 11.3
28.06 6.92 22.26 11.34
;
run;

上記は、読みやすさのために 16x40 ではなく 4x4 のスニペット バージョンです。

2 つのラベルを一緒に追加することにより、比較と新しい変数の作成を処理する小さなデータ ステップとマクロを考え出しました。

data test2;
set test;

%macro mk_combinations(first_var, second_var);
    &first_var._&second_var. = max(of &first_var. &second_var.);
%mend mk_combinations;

%mk_combinations(A, B);
%mk_combinations(A, C);
%mk_combinations(A, D);
%mk_combinations(B, C);
%mk_combinations(B, D);
%mk_combinations(C, D);
run;

これは、A と C の組み合わせが最高の総計になることを示すために私が探していたものを達成しますが、変数が 40 個あるため、このマクロを手動で何度も呼び出すことは現実的ではありません。

複雑なことに、フィールドは 1 文字ではなく、姓と名のフィールドであり、使用できる数値 ID もありますが、proc 転置後は _1 から _40 になります。

私の質問の最初の部分は、プログラムで %mk_combinations を呼び出す最良の方法は? do ループを使用して配列を試しましたが、機能しません。

2 番目の質問は、それが解決されたら、16 個の観察結果を単純に合計する最も簡単な方法は何ですか? 最初は簡単な部分だと思っていましたが、私が知っているすべての方法は、すべての変数を呼び出して明示的に合計することに依存しています。つまり、proc means または proc SQL です。

この問題を解決する方法についてのアイデアはありますか? この問題に対するより良いアプローチはありますか?

4

1 に答える 1

1

問題を効率的に解決するには、データ構造を変更する必要があるように思えます。垂直構造から始めて、最初にその方法で解決できるかどうかを確認します。

data have;
array people[40];
do _n_ = 1 to 16;
  do _t_ = 1 to dim(people);
    people[_t_] = 20*ranuni(7);
  end;
  output;
end;
drop _:;
run;

data have_vert;
set have;
array people[40];
do person = 1 to dim(people);
  people_value = people[person];
  obs_value = _n_;
  output;
end;
keep person people_value obs_value;
run;

そうすれば、40 個ではなく 3 個の変数が得られます。次に、分析を行います (完全には理解できていませんが、十分に簡単なはずです)。

それが簡単な場合は、単に反転することもできます (行として人、列として観察)。

特定の質問に答えるために、どちらも同じ手法を使用します。

proc sql;
 select name into :namelist separated by ' ' 
  from dictionary.columns
  where libname='WORK' and memname='HAVE' and name ne 'ID';

終了する;

これは SELECT INTO を使用して、select クエリの結果を含むマクロ変数を作成します ( &namelist: は、作成段階で & を置き換えます。そのため、作成時に & を使用して、置き換えられたテキストを示すことができます)。区切り記号 (通常はスペース、場合によってはコンマまたはセミコロン) をマクロ変数の結果の間に置きます。この特定のクエリはdictionary.columns、すべてのライブラリのすべてのデータセットのすべての列を含むデータセット (したがって where 句) を使用します。

したがって、最初の質問は、dictionary.columns をそれ自体に結合してデカルト積を作成することで解決される場合があります。2 つ目は、PROC MEANS (または何でも) を合計するすべての変数のリストを作成して、同様の方法で実行されます。

最後に、これをすべて手動で行うのではなく、実行している分析に役立つ可能性のある SAS PROC のいくつかを読むことを検討してください。結局のところ、あなたが実際に何をしているのかはわかりませんが、これは SAS/STAT proc の 1 つがあなたのために行うかもしれないことのように私には思えます。または SAS/IML。

于 2013-07-27T04:16:09.947 に答える