0

私は2セット持っています。最初のものは大きく (~1000k 行)、2000 年から 2005 年までの観察年ごとにグループ化された患者観察データが含まれていますシーケンス)、たとえば 2002 年から 2003 年のみの観測があるものもあります。

2 番目のセットには、2000 年から 2005 年までの 6 行の一連の年のみが含まれます。

私が欲しいのは、各患者のセット 1 からのデータを含むテーブルですが、各患者についてセット 2 からの各年の観察結果が表示されるように拡張され、セット 1 に特定の年の観察結果がなかった場合は、空の行を追加するか、データのみに空 (または「-」) を追加する必要があります。

たとえば、セット 1 は次のようになります。

patient_id | obs_year | data
a            2000       10
a            2001       12
a            2002       13
a            2003       9
a            2004       1
a            2005       6
bb           2002       100
bb           2003       110

セット 2 は次のようになります。

year |
2000
2001
2002
2003
2004
2005

したがって、理想的には次のような結果が必要です。

patient_id | obs_year | data
a            2000       10
a            2001       12
a            2002       13
a            2003       9
a            2004       1
a            2005       6
bb           2000       -
bb           2001       -
bb           2002       100
bb           2003       110
bb           2004       -
bb           2005       -

また、私はこの仕事を SAS で行っていることにも言及しておく必要があります。そのため、SQL クエリまたは SAS スクリプト (またはその両方) のソリューションを歓迎します。

4

2 に答える 2

0

もう 1 つのオプションはPROC FREQwithsparseです。これは、表示されるかどうかに関係なく、すべての可能な組み合わせに対して線を生成します。これは、データに正当なゼロがない場合に機能します。それらが行方不明とは異なることを気にしている場合、これは機能しません。

proc freq data=have noprint;
weight data;
tables patient_id*obs_year/missing sparse out=want(rename=count=data keep=count patient_id obs_year);
run;

次に、違いが気になる場合は、0 を欠落に戻す必要があります (おそらく次のステップで、違いがある場合)。

より望ましい結果に近い同様のアプローチは、proc tabulateprintmiss同様に機能する を使用したものsparseです。

proc tabulate data=have out=want(keep=patient_id obs_year data_sum rename=data_sum=data);
class patient_id obs_year;
var data;
tables patient_id,obs_year*data*sum='data'/printmiss misstext='.';
run;

実際には、欠損値が適切に取得されます。

于 2013-10-17T14:35:00.547 に答える