1

次のようなデータセットがあります (空白で各製品が区切られていることに注意してください)。

Client_ID      Purchase
121212         "Orange_Juice Lettuce"
121212         "Banana Bread "
230102         "Banana Apple"
230102         "Chicken"
121212         "Chicken Bread"
301450         "Grapes Lettuce"
...            ...

ここで、各アイテムのダミー変数を使用して、各人が購入する製品を知りたいと思います。

Client_ID    Apple    Banana    Bread    Chicken    Grapes    Lettuce    Orange_Juice
121212       0        1         1        1          0         1          1  
230102       1        1         0        1          0         0          0
301450       0        0         0        0          1         1          0
...          ...      ...       ...      ...        ...       ...        ...

数週間前に同様の質問をしましたが、ここの場合のように、同じ行に複数の項目がありませんでした。だから私は本当に迷っています。アイテムを複数の列に分けようとしましたが、購入ごとにアイテムの数が異なる可能性があるため(私の知る限り、最大数十個)、理想的ではありませんでした。

続行する方法についてのアイデアはありますか?前もって感謝します!

4

3 に答える 3

2

これは、PROC FREQ と PROC TRANSPOSE を使用した柔軟なソリューションです。SPARSE オプションはゼロを取得します。1または0のみが必要であると想定しているため、NODUPKEYソート。最初の ID の BREAD に 2 が必要な場合は、NODUPKEY を削除します (または並べ替えを完全に削除します)。

まず、ID/製品ごとに 1 つのレコードを持つ垂直データセットを作成します (購入を製品に分割します)。次に、そのデータセットを PROC FREQ して、クライアント/製品の組み合わせごとに 1/0 のデータセットを取得します。次に、製品を ID として使用して転置し、VAR として数えます。

誰も持っていない場合でもゼロとして表示されることを保証したい製品がある場合は、ダミーのクライアント ID とすべての可能な製品を使用して、最初のテーブル (または proc freq の前のもの) に行を追加する必要があります。転置は、ダミーのクライアント ID を削除します。

data test;
input @1 Client_ID  6.   @16 Purchase $50.;
datalines;
121212         Orange_Juice Lettuce
121212         Banana Bread 
230102         Banana Apple
230102         Chicken
121212         Chicken Bread
301450         Grapes Lettuce
;;;;
run;

data vert;
set test;
format product $20.;
do _x = 1 by 1 until (missing(product));
  product=scan(purchase,_x);
  if not missing(product) then output;
end;
run;
proc sort data=vert nodupkey;
by client_id product;
run;

proc freq data=vert;
tables client_id*product/sparse out=prods;
run;

proc transpose data=prods out=horiz;
by client_id;
id product;
var count;
run;
于 2012-09-05T13:35:21.853 に答える
0

以下は、データ ステップ プログラミング ソリューションです。

proc sort data=have;
   by client_id;
run;
data want(keep=client_id apple banana bread chicken grapes lettuce orange_juice);
   set have;
      by client_id;
   retain apple banana bread chicken grapes lettuce orange_juice;
   if first.client_id then do;
      apple = 0;
      banana = 0;
      bread = 0 ;
      chicken = 0;
      grapes = 0;
      lettuce = 0;
      orange_juice = 0;
      end;
   length item $20;
   _x = 1;
   item = scan(purchase,_x);
   do while(item ne ' ');
      select(item);
         when('Apple') then apple = 1;
         when('Banana') then banana = 1;
         when('Bread') then bread = 1;
         when('Chicken') then chicken = 1;
         when('Grapes') then grapes = 1;
         when('Lettuce') then lettuce = 1;
         when(("Orange_Juice') then orange_juice = 1;
         otherwise;
         end;
      _x = _x + 1;
      item = scan(purchase,_x);
      end;
   if last.client_id then output;
run;

編集:PURCHASE各変数の複数の項目に関する質問の一部を見逃しました。ありがとうジョー!

于 2012-09-05T13:02:20.507 に答える