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