簡體   English   中英

SAS宏中的SAS傳遞陣列

[英]SAS pass array in SAS macro

我嘗試根據現有列進行一些計算,然后將結果添加回數據集中。 有人可以幫忙嗎?

這是我嘗試在SAS中編寫的內容:

%macro ColumnCal1(m,prefix);
data _null_;
attr_&prefix. = sum(of &m.1-&m.3);
call symput("attr_&prefix.",attr_&prefix.);
run;
%mend ColumnCal1;

data c2;
set c1;
array mth{12} m1-m12;
%ColumnCal1(m=mth, prefix=ttl);
attr_ttl =&attr_ttl.;  
run;

您不能嵌套數據步驟。 SAS看到啟動的新數據步驟后,它將停止編譯第一個數據並運行它。 另外,由於數據步驟中沒有SET語句,您當前的宏如何知道如何查找數據? 同樣,您不能引用尚未創建的宏變量。 因此,如果使用CALL SYMPUTX()函數生成宏變量,則無法引用其值來修改當前數據步驟的代碼,因為在執行call symputx()之前,必須已對數據步驟進行了編譯。

這樣的事情可能會起作用。

%macro ColumnCal1(m,prefix);
attr_&prefix. = sum(of &m.1-&m.3);
call symput("attr_&prefix.",attr_&prefix.);
%mend ColumnCal1;

data c2;
  set c1;
%ColumnCal1(m=mth, prefix=ttl);
run;

如果我了解該問題,則您有一個數據集,並且想要使用宏來計算不同列的總和。 我在下面分享了一個例子。 試試看。
假設您有一個具有如下數組的數據集:

data have;
array mnth{*} m1-m4;
input mnth{*};
cards;
1 3 6 9
2 4 8 10
;
run;

代碼:要計算不同列的總和,將使用參數創建宏columncal1
1)輸入:包含變量的輸入文件
2)開始:需要從中計算總和的第一列
3)結束:需要計算總和的最后一列
4)前綴:計算列名稱的前綴
5)輸出:給出結果的輸出文件

%macro ColumnCal1(input=,start=,end=,prefix=,output=);
data &output.;
set &input.;
attr_&prefix = sum(of &start.-&end.);
run;
%mend ColumnCal1;

%ColumnCal1(input=have,start=m1,end=m2,prefix=ttl,output=want1);   
/* Dataset want1 having all the initial columns plus sum of m1 and m2 stored in a variable attr_ttl has been created from have dataset*/

%ColumnCal1(input=want1,start=m2,end=m3,prefix=ttl1,output=want2);  
/* Dataset want2 having all the initial columns plus sum of m1 and m2 stored in a variable attr_ttl has been created from want1 dataset*/

我的輸出(want2):

m1  |m2 |m3 |m4 |attr_ttl |attr_ttl1
1   |3  |6  |9  |4        |9
2   |4  |8  |10 |6        |12

如果您有其他要求,請告訴我。

暫無
暫無

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

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