我有一个这样的数据集:
DATA HAVE;
INPUT _USUBJID $ VISITNUM $ VISIT $ ;
CARDS;
01/01 VISIT1 SCREENING
01/01 VISIT1 SCREENING
01/01 VISIT1 SCREENING
01/01 VISIT1 RETEST
01/01 VISIT1 RETEST
01/01 VISIT3 BASELINE2
01/01 VISIT3 BASELINE2
01/01 VISIT3 RETEST
01/01 VISIT3 RETEST
01/02 VISIT1 SCREENING
01/02 VISIT1 SCREENING
01/02 VISIT3 BASELINE2
01/02 VISIT3 BASELINE2
;
RUN;
我需要将其重组为:
DATA WANT;
INPUT _USUBJID $ VISITNUM $ VISIT $ ;
CARDS;
01/01 VISIT1 RETEST
01/01 VISIT1 RETEST
01/01 VISIT3 RETEST
01/01 VISIT3 RETEST
01/02 VISIT1 SCREENING
01/02 VISIT1 SCREENING
01/02 VISIT3 BASELINE2
01/02 VISIT3 BASELINE2
;
RUN;
如果一个受试者同时具有筛选和重测值,我需要提取该受试者的重测值。如果受试者没有任何重新测试值,那么我只需要访问(即筛选或本例中的BASELINE2)。
我会分三个阶段进行:
- 将重测_usubjid、访问数对和相关值抓取到一个数据集(下面称为重测)
- 通过从原始对中减去重测对,然后将值重新连接回(下面称为 onetest),获取另一个数据集的无重测_usubjid、访问数对和相关值
- 连接重测值和不重测值。
SQL中的示例:
proc sql;
create table retest as
select *
from have
where VISIT="RETEST";
create table onetest as
select * from
((select distinct _usubjid, visitnum
from have)
except
(select distinct _usubjid, visitnum
from retest)) as onetesters
left join
have on
onetesters._usubjid = have._usubjid and
onetesters.visitnum = have.visitnum;
create table want as
select * from retest
union all
select * from onetest;
quit;