在使用P21E进行SDTM数据Validation时,FA数据集可能会出现这样的issue:
SD0005: Duplicate value for FASEQ variable.
在SDTM数据集中,对受试者的每一条记录来讲,--SEQ变量应该是独特的、唯一的。关于这一点,不管是手动编程,还是各家公司的宏程序,应该都会处理好。
这里出现这个Issue的原因是,P21E在Validate SDTM数据集时,会将所有FA数据集综合在一起进行检查,这就导致一个受试者的一个FASEQ值出现多次。
这个问题的处理方法不复杂,FA数据集按照一定顺序依次生成,后一个数据集中受试者的FASEQ取值,从前一个数据集中该受试者最大FASEQ值+1起计数。这样就能保证,进行Validation时,对某个受试者来讲,FASEQ的值是不会重复的。(当然,+任意正整数都可以避免这个Issue)
基于以上方法,提供一个SAS编程实现思路:
- 两个FA数据集,按常规思路从数值1开始生成FASEQ变量;
- 获取前一个数据集中的每一个受试者的FASEQ最大值;
- 后一个数据集以USUBJID为关键变量,左拼接获取最大值;
- 后一个数据集中FASEQ加上拼接获取的最大值。
建立2个模拟数据集,都包含从数值1开始的FASEQ变量:
data class1;
set sashelp.class;
if _n_ <=2 then do;
do FASEQ_ = 1 to 2;
output;
end;
end;
run;
data class2;
set sashelp.class;
if _n_ <=4 then do;
do FASEQ_ = 1 to 3;
output;
end;
end;
run;
这两个数据集的内容如下:
SAS程序实现的效果是,在Class2中,Alfrd与Alice这两位受试者的FASEQ变量都会加上Class1数据集中的最大值2。
演示程序如下:
proc sql norpint;
create table class2_final as
select a.*, b.max, sum(faseq_, b.max) as FASEQ
from class2 as a
left join
(select name, max(faseq_) as max
from class1
group by name
) as b
on a.name = b.name
order by name, faseq
;
run;
程序中解释一点,后一个数据集FASEQ变量与最大值求和时,使用sum
函数是为了规避与空值相加还是空值的情况。如果不使用sum
函数的话,还需要用条件语句进行判断max是否为空。
这样处理就可以规避Issue SD0005,各家公司也可以考虑将这个功能添加到SEQ宏程序中。
感谢阅读, 欢迎关注:SAS茶谈!
若有疑问,欢迎评论交流!
欢迎点赞、转发!
网友评论