0

次のデータセットがあります

data height;
    input name $ var $ value;
    datalines;
John test1 175
Peter test1 180
Chris test1 140
John test2 178
Peter test2 182
Chris test2 148
;
run;

各生徒の2つのテストの平均値を出したい

次のようにして、 mean_v_John という名前の新しい変数を作成できます

proc sql;
    select mean(value) into: mean_v_John
    from height
    where name = 'John';
quit;

%put &mean_v_John.;

出力あり:

2216  %put &mean_v_John.;
176.5

問題: 生徒数を自動検出し、&mean_v_NAME で変数を作成するにはどうすればよいですか? この例では、3 つの変数があります。

4

2 に答える 2

3

各生徒の平均を計算することから始める場合は、そのテーブルを使用して、call symputルーチンでマクロ変数を割り当てることができます。お気に入り:

data height;
input name $ var $ value;
datalines;
John test1 175
Peter test1 180
Chris test1 140
John test2 178
Peter test2 182
Chris test2 148
;
run;

proc sql noprint;
create table work.mean_height as
select name, mean(value) as mean_height
from work.height
group by name;

data _null_;
   set work.mean_height;
   call symput("mean_v_"||name,mean_height);
run;

%put John mean: &mean_v_John.;
%put Peter mean: &mean_v_Peter.;
%put Chris mean: &mean_v_Chris.;
于 2015-06-12T07:25:27.157 に答える
1

これを希望どおりに SAS で直接行うことはできませんが (大部分は、これは SAS では慣用的なものではないため)、1 つのステップで比較的近いことを行うことができます。

実際の名前を使用せずに増分番号を使用すると、マクロ変数疑似配列で同じ基本的な結果を得ることができます。以下を参照してください。

proc sql;
  select age, mean(height) into :age1-:age8, :height1-:height8
  from sashelp.class
  group by age;
quit;

%put _global_;

1 つは年齢を格納し、もう 1 つは対応する平均身長を格納します。あなたの名前でも同じことができます。

マクロ変数の疑似配列は言語構造ではありませんが、このように使用したい人々によって支持されているようなものです。その結果、さまざまなカスタム マクロの実装 (Google で「SAS マクロ配列」を検索してから、最適な実装を選択してください) でそれらを使用することに関する論文が多数出回っています。

于 2015-06-12T14:50:01.103 に答える