交错SAS数据集(按常用患者编号)

时间:2016-03-01 15:33:53

标签: merge sas interleave

我需要交错到SAS数据集,但前提是它们都存在患者ID。在合并声明中,我在"中使用"和"如果"但是,我需要堆叠数据。数据在变量方面是等价的。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这是一个单一的工作,但如果数据集是相同的,那么你可以尝试下面的。假设您在变量ID上匹配。

proc sql;
select t1.*
from
  TABLE_A t1
where ID in (select ID from TABLE_B)
union all
select t2.*
from
  TABLE_B t2  
where ID in (select ID from TABLE_A)
;quit;

答案 1 :(得分:0)

如果在任一数据集上只有一行,则在数据步骤中这很容易做到。

data have_1;
  do id = 1 to 20 by 2;
    output;
  end;
run;

data have_2;
  do id = 1 to 20 by 3;
    output;
  end;
run;

data want;
  set have_1 have_2;
  by id;
  if not (first.id and last.id);
run;

基本上,如果它不是该ID的第一行或不是最后一行,则只输出一行 - 如果它在两个数据集中都是如此。如果每个ID的数据集中有多行,则不起作用。

答案 2 :(得分:0)

如果您在一个或两个数据集中每个ID都有重复项,那么您有许多其他解决方案。这是与MERGE想法最相似的一个。

在Double DoW循环中,您循环遍历数据集两次,一次检查您的状况,然后一次实际输出。这使您可以查看每个ID的所有行,查看您的条件是否有效,然后再次查看它们以便根据该条件执行操作。

data have_1;
  do id = 1 to 20 by 2;
    output;
    output;
  end;
run;

data have_2;
  do id = 1 to 20 by 3;
    output;
    output;
  end;
run;



data want;
  _a=0;  *initialize temporary variables;
  _b=0;  *they will be cleared once for each ID;
  do _n_ = 1 by 1 until (last.id);
    set have_1(in=a) have_2(in=b);
    by id;
    if a then _a=1;  *save that value temporarily;
    if b then _b=1;  *again temporary;
  end;
  do _n_ = 1 by 1 until (last.id);
    set have_1 have_2;
    by id;
    if _a and _b then output;  *only output the rows that have both _a and _b;
  end;
run;