0

我有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

第 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 中删除您的患者 ID。将其合并到 set 2 以提供每个患者 ID 与年份,然后将其合并回 set 1 by patient_id 和 year 以提供您的输出。Patient_id 和 year 不匹配的任何地方都将是空白,如您所需的输出

于 2013-10-17T10:10:14.620 回答
0

另一个选项是PROC FREQwith 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 tabulatewith 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;

这实际上确实让你正确地丢失了值。

于 2013-10-17T14:35:00.547 回答