按顺序扩展所有年份的观察结果

时间:2013-10-17 09:30:50

标签: sql sas

我有2套。 第一个是大的(~1000k行),它包含按观察年份分组的患者观察数据,从2000年到2005年。在这个集合中,有一些患者包含所有年份的观察结果(或者我应该说每个年的顺序),有些只有例如2002-2003年的观察结果。

第二组仅包含从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

Set 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脚本(或两者)解决方案。

2 个答案:

答案 0 :(得分:0)

将第1组中的patient_id重新排序。将其合并到第2组以给出每个patient_id多年,然后通过patient_id和year将其合并到第1组以提供输出。 patient_id和year不匹配的任何位置都将为空白,如您所需的输出

答案 1 :(得分:0)

另一个选项是PROC FREQsparse,它会为每个可能的组合产生一条线,无论它们是否出现。如果您在数据中没有任何合法的零,则此方法有效;如果你这样做并且关心他们与失踪的不同,那就不会有所作为。

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 tabulate printmiss,其效果与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;

这实际上确实让你错过了正确的价值。