1

複数のデータ セットを 2 つの数値の間で別々のグループに分けて比較しようとしています。もともと、私は次のような声明を持っていました。

if COLUMN1 gt 0 and COLUMN1 LE 1000 then PRICE_GROUP = 1000;

これを1000から100,000まで上げました。唯一の問題は、各 price_group に含まれる数を数えると、一部の price_group が欠落していたことです (57,000 には値がなかったため、(Price_group) を数えたときに一部のグループには表示されませんでした)。私が考える解決策は、それぞれの境界を含むテーブルを作成し、実際の値と上限および下限を比較することです。

proc iml;

  mat = j(100,2,0);

  total = 100000;

  mat[1,1] = 0;
  mat[1,2] = mat[1,1] + (total/100);
  do i = 2 to nrow(mat);
        mat[i,1] = mat[i-1,1] +  (total/100);
        mat[i,2] = mat[i,1] + (total/100);
  end;

create dataset from mat;
append from mat;
quit;

これにより、値を比較できるテーブルが作成されますが、proc iml 以外に簡単な方法はありますか? 次に、ループを実行して各値を 2 つの列と比較し、テーブルに新しい列を作成して、各バケットにカウントを入れます。これは依然として非効率な集中的なプロセスのようです。

4

2 に答える 2

1

IML はひどいソリューションではありませんが、正確に何をしているかに応じて、他にもいくつかのソリューションがあります。

最も一般的なのはproc format. 次のように、各バケットを管理するフォーマットを作成します。

proc format;
value buckets
0-1000 = 1000
1000<-2000 = 2000
...
other="NA";
quit;

次に、フォーマット(または入力フォーマット)を使用して、バケット値で新しい変数を作成するか、さらに良いことに、その場でフォーマットを使用できます(つまり、proc手段またはその他のもの)。これは、必要がないことを意味するだけではありませんデータセットを書き換えますが、必要なバケットの数に応じて、フォーマットのオンとオフを切り替えることができます (たとえば、buckets100フォーマットなどbuckets20)。

第二に、あなたの特定の質問は、数学を使用するだけで解決できるように見えます:

data want;
set have;
bucket = &total/100*(1+floor(column1/(&total/100)));
run;

明らかに、すべての例でうまくいくわけではありません。

第 3 に、形式を使用できない場合 (バケットを決定する要素が 2 つ以上ある場合など) は、ハッシュ ルックアップ テーブルを使用できます。それが役立つ場合は、それを拡張するか、SASでのルックアップに非常に一般的に使用されるため、グーグルで検索できます。これは、通常のデータステップ内の IML ソリューションに最も近いソリューションです。

于 2013-08-07T21:03:26.123 に答える
0

グループを含む別のテーブルを作成します。

data group_table;
do price_group=1000 to 100000 by 1000;
output;
end;
run;

次に、price_group をキーとして使用して、グループ化/比較テーブルをこの新しいテーブルと結合します。

proc sql;
    create table price_group_compare as
    select L.price_group,R.group1_count,R.group2_count
    from group_table as L, group_counts as R
    on L.price_group = R.price_group;
quit;
于 2016-08-30T18:47:17.113 に答える