将多个治疗记录转换为一行
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;
所以我有这个数据集。我基本上需要连接所有 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;