1

私は次のようなデータを持っています:

id t   x 
1  1  3.7 
1  3  1.2 
1  4  2.4 
2  2  6.0 
2  4  6.1 
2  5  6.2 

それぞれについてid、必要に応じて観測値を追加して、すべての1 <= t<=5の値が存在するようにします。

したがって、私の望ましい結果は次のとおりです。

id t   x 
1  1  3.7 
1  2  .
1  3  1.2 
1  4  2.4 
1  5  .
2  1  .
2  2  6.0 
2  3  .
2  4  6.1 
2  5  6.2 

私の実際の設定には大量のデータが含まれるため、これを行うための最も効率的な方法を探しています。

4

3 に答える 3

2

これがおそらく最も簡単な方法で、PROCSUMMARYのCOMPLETETYPESオプションを使用します。idとtの組み合わせはデータ内で一意であると想定しています。非常に大きなデータセットに対して実行するときにメモリの問題が発生するかどうかはわかりませんが、過去にこの点でPROCSUMMARYに問題がありました。

data have;
input id t x;
cards;
1  1  3.7 
1  3  1.2 
1  4  2.4 
2  2  6.0 
2  4  6.1 
2  5  6.2 
;
run;

proc summary data=have nway completetypes;
class id t;
var x;
output out=want (drop=_:) max=;
run;
于 2013-02-13T09:00:03.903 に答える
1

ETSがある場合、1つのオプションはPROCEXPANDを使用することです。それがあなたが望むことの100%をするかどうかはわかりませんが、それは良いスタートかもしれません。これまでのところ、主な問題は最初または最後にレコードを作成しないことのようですが、それは克服できると思います。方法がわからない。

proc expand data=have out=want from=daily method=none extrapolate;
by id;
id t;
run;

これは、ID 1の場合は2、ID 2の場合は3を入力しますが、ID1の場合は5、ID2の場合は1を入力しません。

ベースSASでそれを行うには、いくつかのオプションがあります。SPARSEオプションを指定したPROCFREQは、適切なオプションである可能性があります。

proc freq data=have noprint;
tables id*t/sparse out=want2(keep=id t);
run;

data want_fin;
merge have want2;
by id t;
run;

可能なt値を持つテーブルへの結合を使用してPROCSQLを介してこれを行うこともできますが、それは私には遅いようです(FREQメソッドには2つのパスが必要ですが、FREQはかなり高速であり、マージはすでにソートされたデータを使用しています遅すぎないように)。

于 2013-02-12T19:14:13.193 に答える
1

Tの最小値/最大値がすでにわかっている場合は、別のアプローチを次に示します。IDとTのすべての値を含むテンプレートを作成し、元のデータセットとマージしてXの値を保持します。

proc sort data=original_dataset out=template(keep=id) nodupkey;
   by id;
run;

data template;
   set template;
   do t = 1 to 5; /* you could make these macro variables */
      output;
   end;
run;

proc sort data=original_dataset;
   by id t;
run;

data complete_dataset;
   merge template(in=in_template) original_dataset(in=in_original);
   by id t;
   if in_template then output;
run;
于 2013-02-12T23:05:29.117 に答える