hi all,我写的这个程序是关于观测合并的,举例如下:
table中有三个变量,eterm是不良事件的soc和pt分级,当soc为一分类,其后的group1 和group2都是空值;pt为二级分类,当group1 和group2都是空值的时候说明存在换行,我写的程序就是将多个换行字符串连接成一个观测;不过这段程序是针对最多换四行的情况,如果有更多换行(比如10行),就要再catx里再加变量;
各位如果有更简洁的方法,不受换行数的限制,欢迎分享!
data table;
input eterm $35. group1 $15. group2 $15. ;
cards;
RESPIRATORY, THORACIC AND
MEDIASTINAL DISORDERS
Total Pts With at Least one AE 12 ( 13) 6 ( 6)
PLEURAL EFFUSION 5 ( 5) 3 ( 3)
BRONCHIAL OBSTRUCTION disorder - 2 ( 2)
BRONCHOSPASM
HAEMOPTYSIS 1 ( 1) -
ASTHMA - 1 ( <1)
BULLOUS LUNG DISEASE 1 ( 1) -
CHRONIC OBSTRUCTIVE PULMONARY - 1 ( <1)
DISEASE ACUTE PULMONARY OEDEMA
DYSPHONIA OBSTRUCTIVE AIRWAYS
DISORDER
EPISTAXIS - -
METABOLISM AND NUTRITION
Total Pts With at Least one AE 9 ( 9) 6 ( 6)
HYPOKALAEMIA 6 ( 6) 1 ( <1)
HYPERGLYCAEMIA 2 ( 2) 3 ( 3)
;
run;
data table;
set table;
if group1 NE '' & group2 NE '' then space=1;
else if eterm='' then space=.;
else space=0;
id=_n_;
run;
proc sql noprint;
select count(1) into: num1
from table
where space=0;
select count(1) into: num2
from table;
select id into: l1-:l%left(&num1)
from table
where space=0;
select eterm into: v1-:v%left(&num2)
from table;
quit;
%macro union;
data table;
set table;
dspace=space-lag(space);
dd=space+dspace;
%do i=1 %to &num1;
%let c1=%eval(&i. +1);
%let c2=%eval(&i. +2);
%let c3=%eval(&i. +3);
%let u1=%eval(&&l&i. +1);
%let u2=%eval(&&l&i. +2);
%let u3=%eval(&&l&i. +3);
%let j=%eval(&&l&i. -1);
%let z=%eval(&&l&i.);
%let v0=;
%let q1=%eval(&num1+1);
%let l&q1.=;
%let q2=%eval(&num1+2);
%let l&q2.=;
%let q3=%eval(&num1+3);
%let l&q3.=;
if id=&j & space^=. & %eval(&&l&c1.- &&l&i.)^=1 then a=catx('',"&&v&j.","&&v&z.");
if id=&j & %eval(&&l&c1.- &&l&i.)=1 then a=catx('',"&&v&j.","&&v&z.","&&v&u1.");
if id=&j & %eval(&&l&c2.- &&l&i.)=2 then a=catx('',"&&v&j.","&&v&z.","&&v&u1.","&&v&u2.");
if id=&j & %eval(&&l&c3.- &&l&i.)=3 then a=catx('',"&&v&j.","&&v&z.","&&v&u1.","&&v&u2.","&&v&u3.");
if space=. | dd^=. & dd<=0 then a='';
if dd^=. & dd<=0 | a^='' then eterm='';
%end;
union=catx('',eterm,a);
drop dspace id1 dd a space eterm;
run;
%mend;
%union;