1.数据核查 这个问题是昨天同事问到我关于数据核查的问题。简单问题描述:核查出受试者与某访视相同访视日期的访视记录,并按照“受试者编号+访视日期+相同的访视名称”组合一条query。如图,如001,query应该为:“001 2017-01-19 第2周期\第3周期”。
同事跟我描述了她的做法,蒙圈了。于是我说给我数据我自己想下。刚拿到这个问题,我想的是visitdate和visit都转置,转成数据中一人一条记录,然后数组处理,但这个转置数据处理比较麻烦,且如果不是连续访视的日期相同,这个数组处理也是有问题的,在处理临床试验数据时,可能性总得多想几条。于是转换思路,访视日期如果相同,就会有2或以上记录,数数+retain就可以处理了。程序如下:
*模拟数据;
data test;
input subjid :$10.visit :$10. visitnum visitdate yymmdd10. aval clsig $10.;
format visitdate yymmdd10.;
cards;
001 第1周期1 2017-01-12 12 正常
001 第2周期2 2017-01-19 19 异常
001 第3周期3 2017-01-19 11 正常
001 第4周期4 2017-02-03 13 正常
001 第5周期5 2017-02-10 4 异常
002 第1周期1 2017-04-01 13 正常
002 第2周期2 2017-04-08 16 正常
002 第3周期3 2017-04-08 19 异常
002 第4周期4 2017-04-08 17 异常
002 第5周期5 2017-05-10 18 异常
;
run;
*数数,筛重;
proc sql;
create table test1 as
select * ,count(subjid) as n from test
group bysubjid,visitdate
having n ge 2
order by subjid,visit;
quit;
*组合query;
data test2;
retain subjid conj;
length conj $100query $100;
set test1;
by subjid visit;
if first.subjid then conj=visit;
else conj=catx("/",conj,visit);
query=catx("",subjid,put(visitdate,yymmdd10.),conj);
if last.subjid ;
keep subjid query;
run;
不追求高大上的宏,简单就好。
2.建基线 临床试验报告中安全性分析部分总有很多报表需要分析与基线数据比较的报表,定量或定性资料的均如此。如定量资料,分析各个访视相对基线的改变值得均数,中位数等,定量资料分析各个访视与基线的交叉表等。而这部分数据皆是BDS数据集,简单的说就是流水账式记录。不管做定量或者定性资料均需要建基线变量,且将基线值填充到每个访视。因此retain是非常管用的办法。刚开始做这行的时候很费劲的建个基线数据集,再和其他访视的数据集进行merge。在help文档中“Causes a variable that is created by an INPUT or assignmentstatement to retain its value from one iteration of the DATA step to the next”。也就是说input或赋值语句创建一个变量,将其值从数据步的一次迭代保留到下一次迭代中。
忽略基线的定义,这里我们就认为第1周期的值为基线值。处理如下:
*****建立基线*****;
proc sort data=test;by subjid visitnum;run;
data test3;
retain subjid visit visitnum visitdate avalclsig;
retain base1 base2;
set test;
by subjid visitnum;
if first.subjid then do;
base1=aval;
base2=clsig;
end;
CHG=aval-base1;
run;
3.改变变量顺序 在做SDTM或ADAM数据集时,我们需要按照变量定义的顺序在数据集中呈现或者变量很多的情况下,我们需要把重要的变量放在最前面以便一目了然的查阅,因此需要改变变量的顺序。变量的顺序,我们可以通过用length语句,或者创建变量的顺序来控制变量在数据集中的顺序,但是往往不需要重新定义变量属性和长度或者创建变量,又或者是多个数据集merge的数据集,这个length或创建变量的方式就可能效率太低或者达不到目的。这时retain就可以轻松排列变量。按顺序列出重要变量即可。
**********改变变量顺序**********;
data test4;
retain subjid visit visitnum base1 base2 visitdate aval clsig;/*变量顺序*/
set test3;
run;