在SAS中转置数据

时间:2016-03-02 09:31:51

标签: sas

我有一个实验室结果的数据集。每行对应于主题的时间点(例如:第1行在他第一次访问时是主题#1,第2行在第二次访问时是主题#1,......)。在每一行中,我有5个测试值(test1,test2,....),对于每个测试,除了结果之外,我还有两列测试参考值(正常的低和高等级)。我希望以一种方式转置数据,每个行对于主题+访问+测试都是相同的,有两列,数字结果和状态(正常与否)。我没有转置数据。我设法以长格式获得所有测试,但我无法保存参考值。我该怎么办?我的替代方案是一组if语句,它会很长!

1 个答案:

答案 0 :(得分:1)

此问题也发布在communities.sas.com上。 两步过程从名称中提取有关PARAMCD(实验室测试代码)和变量类型(值和正常范围限制)的数据。 PARAMCD成为新的行id变量,当数据再次转换为或多或少(CDISC SDTM)格式时,V L和H用于创建新的变量名。

data A;
   input ID Visit Group Test1 Test2 Test3 Test1_L Test1_H Test2_L Test2_H Test3_L Test3_H;
   datalines;
1 1 0 5 3 6.7 1 10 2 7 3 9
1 2 0 5.5 3.8 8.7 1 10 2 7 3 6
1 3 0 4.5 2.8 5.7 1 10 3 7 3 6
2 1 1 5 3 6.7 1 10 2 7 3 9
2 2 1 5.5 3.8 8.7 1 10 2 7 3 9
2 3 1 4.5 2.8 5.7 1 10 2 7 3 9
;;;;
   run;
proc print;
   run;
proc transpose data=a out=b;
   by id visit group;
   run;
data b;
   set b;
   length paramcd $8 namecd $1;
   call scan(_name_,1,p,l,'_');
   paramcd = substrn(_name_,p,l);
   namecd  = coalesceC(substrn(_name_,p+l+1),'V');
   drop p l _name_;
   run;
proc sort data=b;
   by id visit group paramcd;
   run;
proc format;
   value $namecd 'V'='Value' 'H'='High' 'L'='Low';
   run;
proc transpose data=b out=c(drop=_name_);
   by id visit group paramcd;
   id namecd;
   format namecd $namecd.;
   var col1;
   run;
data c;
   set c;
   length RangeFL $1;
   if      n(low,value)  eq 2 and value lt low  then RangeFL='L';
   else if n(high,value) eq 2 and value gt high then RangeFL='H';
   else                                              RangeFL='N';
   run;
proc print;
   run;