簡體   English   中英

數組下標超出范圍在 SAS 中的行錯誤

[英]Array subscript out of range at line Error in SAS

我正在嘗試使用 arrays 創建一組新的變量。 但我收到此錯誤“錯誤:第 581 行第 23 列的數組下標超出范圍。”

在我的程序中,我有一組宏變量 n1 到 n15 這是我的代碼,我無法找出我的 arrays 是如何超出范圍的,因為所有 arrays 都有 15 個元素

data allsae1; 
*length _a1 _a2 _a3 _a4 _a5 _a6 _a7 _a8 _a9 _a10 _a11 _a12 _a13 _a14 _a99 _b1 _b2 _b3 _b4 _b5 _b6 _b7 _b8 _b9 _b10 _b11 _b12 _b13 _b14 _b99 $10;
set  allsae; 

array _anum{15} a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a99;
array _bnum{15} b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b99;
array astat{15} _a1 _a2 _a3 _a4 _a5 _a6 _a7 _a8 _a9 _a10 _a11 _a12 _a13 _a14 _a99;
array bstat{15} _b1 _b2 _b3 _b4 _b5 _b6 _b7 _b8 _b9 _b10 _b11 _b12 _b13 _b14 _b99;

%macro stats;

%do i=1 %to 15;
    %if _anum[i] !=. %then %do;
    astat[i]=strip(put(_anum[i], best.))||" ("||strip(put(_anum[i]/(&&n&i) *100, 8.1))||"%)";
    %end;

    bstat[i] = strip(put(_bnum[i], best.));
%end;
%mend stats;
%stats;
run;

為什么這里有宏代碼? 我看不到任何需要生成 SAS 代碼的地方。 唯一的地方是對&&n&i的引用,但我看不到您在哪里定義了任何名為 N1、N2 等的宏變量。

字符串_anum[i]總是不等於字符串. 所以你總是生成 SAS 語句

astat[i]=strip(put(_anum[i], best.))||" ("||strip(put(_anum[i]/(<something>) *100, 8.1))||"%)";

但是您從未創建變量I ,因此astat_anum arrays 的索引將無效。

很可能您只需要一個普通的 DO 循環,根本不需要定義宏。 如果你真的有這 15 個宏變量並且它們包含數字字符串,你可能只使用 SYMGETN() function。

do i=1 to 15;
  if not missing(_anum[i]) then do;
    astat[i]=strip(put(_anum[i], best.))||" ("||strip(put(_anum[i]/(symgetn(cats('n',i))) *100, 8.1))||"%)";
  end;
  bstat[i] = strip(put(_bnum[i], best.));
end;

或者只是制作一個臨時數組來擁有這 15 個值。

array _n[15] _temporary_ (&n1 &n2 &n3 &n4 .... &n15);

然后您使用I變量對其進行索引。

... _n[i] ...

您在這里需要 arrays 而不是宏。 您正在嘗試使用宏變量,但我建議您將宏變量 N 分配給數組。 我還建議創建單個宏變量而不是 N,這樣您就不必處理索引和宏循環。

使用這樣的東西創建你的 N:

proc sql noprint;
select n into N_list_values separated by ", " from yourTable;
quit;

%put &n_list_values;

然后你可以在以后像這樣在數組中使用它。

array _anum{15} a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a99;
array _bnum{15} b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12 b13 b14 b99;
array astat{15} _a1 _a2 _a3 _a4 _a5 _a6 _a7 _a8 _a9 _a10 _a11 _a12 _a13 _a14 _a99;
array bstat{15} _b1 _b2 _b3 _b4 _b5 _b6 _b7 _b8 _b9 _b10 _b11 _b12 _b13 _b14 _b99;

array _n(15) _temporary_ (&N_list_values);



do i=1 to 15;
    if _anum[i] !=. then do;
    astat[i]=strip(put(_anum[i], best.))||" ("||strip(put(_anum[i]/(_n(i)) *100, 8.1))||"%)";
    end;


bstat[i] = strip(put(_bnum[i], best.));
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM