我有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脚本(或两者)解决方案。
答案 0 :(得分:0)
将第1组中的patient_id重新排序。将其合并到第2组以给出每个patient_id多年,然后通过patient_id和year将其合并到第1组以提供输出。 patient_id和year不匹配的任何位置都将为空白,如您所需的输出
答案 1 :(得分:0)
另一个选项是PROC FREQ
和sparse
,它会为每个可能的组合产生一条线,无论它们是否出现。如果您在数据中没有任何合法的零,则此方法有效;如果你这样做并且关心他们与失踪的不同,那就不会有所作为。
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;
这实际上确实让你错过了正确的价值。