我正在尝试使用数组将数据集从长格式转置为宽格式。我想将重复表单的表单完成日期拉入几列,以便每一行只有一个参与者,所有表单都在一行上。由于我必须对多个变量执行此操作,因此我想避免使用 proc 转置,因此我尝试使用数组将数据从长格式转换为宽格式。我正在遵循 SAS 关于使用数组进行转置的指南,但在将其复制到我的数据集时遇到问题。具体来说,我收到“数组下标超出第 39 行第 4 列范围”的错误。
以下是我的代码,我在故障排除时遇到问题。
proc sort data=bl out=longsrt;
by pid;
run;
data wide;
set longsrt;
by pid;
keep pid c10:;
retain c10:;
array ac10_formcompletedate{*} c10_formcompletedate;
if first.pid then
do;
do i = 1 to 500;
ac10_formcompletedate ( i ) = .;
end;
end;
ac10_formcompletedate( redcap_event_name_bl ) = c10_formcompletedate;
if last.pid then output;
run;
这是我的数据集的一个小示例(对于熟悉 REDCap 的人来说,它是一个 REDCap 导出文件):
data bl;
input pid redcap_event_name_bl c10_formcompletedate;
cards;
10001 baseline 2023-10-18
10001 baseline .
10001 baseline .
10001 baseline 2023-10-19
10002 baseline .
10002 baseline 2023-10-18
10002 baseline 2023-10-18
10003 baseline .
10003 baseline 2023-10-18
;
run;
您已经使用单个变量定义了
ac10_formcompletedate
数组,因此任何高于该变量的索引都会出错。此外,您所拥有的一个变量已经存在于输入中并且包含您想要转置的数据。尝试 array ac10_formcompletedate {*} c10_formcompletedate1-c10_formcompletedate500;
或类似的。您还可以用 call missing(of ac10_formcompletedate{*});
替换将数组设置为缺失的代码,它将自动缩放到其尺寸。
您尚未遇到的第二个问题是您使用
redcap_event_name_bl
作为数组索引,但变量似乎是字符。这是行不通的,请记住,您的数组当前索引从 1 到 500。我可以建议类似:
by pid;
if first.pid then index = 0;
index + 1;
ac10_formcompletedate[index] = c10_formcompletedate;
if last.pid then output;
(如果一个记录超过 500 条,仍然会崩溃
pid
)