从长格式转换为宽格式时如何使用数组?数组下标超出范围错误

问题描述 投票:0回答:1

我正在尝试使用数组将数据集从长格式转置为宽格式。我想将重复表单的表单完成日期拉入几列,以便每一行只有一个参与者,所有表单都在一行上。由于我必须对多个变量执行此操作,因此我想避免使用 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;
sas transpose
1个回答
0
投票

您已经使用单个变量定义了

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

© www.soinside.com 2019 - 2024. All rights reserved.