将多个治疗记录转换为一行

Converting multiple treatment records to one row

所以我有这个数据集。我基本上需要连接所有 con med 治疗 (CMTRT),以便它们是水平的,以便每天的每个结果只有一行。我在这里的想法是使用 PROC TRANSPOSE 并创建一个前缀标签 CMTRT 所以我有 cmtrt_1、cmtrt_2 等所以在接下来的数据步骤中我可以使用 catx 组合成一个变量。这是对的还是有更好的方法?

假设您需要 RELCM 的最后一个值,以下应该会为您提供预期的输出。

proc sort data=have out=stage1; by subjid paramcd avalc avisit; run;

data stage2;
    set stage1;
    by subjid paramcd avalc avisit;

    if first.avisit then
        group_number+1;
run;

data want;
    set stage2;
    by subjid paramcd avalc avisit group_number;
    retain _cmtrt;
    *-- set large enough to accommodate the maximum number of records --*;
    length _cmtrt 00;
    
    if first.group_number then
        _cmtrt='';
    _cmtrt=catx(', ', _cmtrt, cmtrt);

    if last.group_number then
        output;
        
    rename _cmtrt=cmrtrt;
    drop cmtrt group_number;
run;

另一种方法是@Richard 的评论所指出的 DoW 循环。

proc sort data=have out=stage1; by subjid paramcd avalc avisit; run;

data want(rename=(_cmtrt=cmtrt));
    do _n_ = 1 by 1 until (last.avisit);
    set stage1;
    by subjid paramcd avalc avisit;
    length _cmtrt 00;
    _cmtrt = catx(', ', _cmtrt, cmtrt);
    end;
    
    drop cmtrt;
run;

假设您的输出数据集中不需要 RELCM

proc sort data=have out=stage1;
    by subjid paramcd avalc avisit;
run;

proc transpose data=stage1 out=stage2;
    by subjid paramcd avalc avisit;
    var cmtrt;
run;

data want;
    set stage2;
    length cmtrt 00;
    cmtrt=catx(', ' , of col:);
    drop _name_ col:;
run;