[英]Macro variables inside data step
我需要將某個變量的值保存在宏的數據步驟中,然后在同一數據步驟中使用該宏。 我嘗試使用SYMPUT
,但是如果我正確理解了以這種方式創建的宏變量,則不能在同一數據步驟中使用(我猜是在數據步驟的末尾分配的)?
這是一個簡化的示例。 我有一個數據字段t1,...,t100
的列表t1,...,t100
表示在某些時間發生的事情,事件由數字表示,而數據字段t_start
為我提供了我對每次觀察都感興趣的過程的開始時間。 我想檢查是否擁有所有數據,否則將其刪除。 我要進行如下操作。
DATA WANT;
SET HAVE;
CALL SYMPUT('START_TIME', t_start);
DO I=&START_TIME. TO 100;
IF t_&I. = . THEN DELETE;
END;
RUN;
我認為這是行不通的,出於上述原因。 有解決方法嗎?
備注:
t1,...t100
而是結構更復雜的東西)。 如果可能的話,我想獲得與上述方法盡可能接近的方法,因為不同的解決方案可能不適用於我的情況。 當然,如果這不可能,那么任何解決方案都將受到歡迎! RESOLVE
,但是它似乎並沒有滿足我的要求(或者至少我不太了解它,無法使其滿足我的期望)。 更新:我按照解決方案中的建議使用數組解決了這個問題。
您正在嘗試使用dataset
變量t_start
和i
來確定要測試的變量。 那就是數組的目的。
DATA WANT;
SET HAVE;
array t t1-t100;
DO I=t_start TO 100;
IF t(i) = . THEN DELETE;
END;
RUN;
不需要宏變量,更不用說可以在時間上向后移動並在數據步驟開始運行后修改其代碼的宏變量。
這可能是使用數組的更好方法。 鑒於您發布的內容,此方法可行。 如果與您的需求不符,請發布有關您情況的更多詳細信息。
data demo;
array t(10);
do row=1 to 100;
do i=1 to 10;
t(i)=rand('integer', 1, 5);
end;
start = rand('integer', 1, 10);
output;
end;
run;
data test;
set demo;
array t(10);
do i=start to dim(t);
if t(i) < 2 then do;
delete;
leave;*exits loop;
end;
end;
run;
當數據步驟正在運行時,該步驟已被“編譯”,並且所有&
號( &
)宏變量解析都已得到解決。 正在運行的已編譯步驟無法更改其源代碼。
如果您兩次提交代碼,則第一次會記錄WARNING: Apparent symbolic reference not resolved.
第二次沒有警告,將使用先前提交的值填充。
假設您的數據記錄有很多變量,還有兩個前哨變量,其值是標記某些處理開始和結束的變量的名稱 。 在使用笨拙的數據構造時,可以使用數組來調解對要處理的變量集的訪問。
例如:
data have;
input
a b c d e f g h start $ stop $ ; datalines;
1 2 3 4 5 6 7 8 d e
11 12 13 14 15 16 17 18 a b
0 1 1 2 3 5 8 11 c h
1 1 1 1 1 . 1 1 a e wont be deleted because . is at f
1 2 3 4 . 6 7 8 a h
run;
data want;
set have;
array num a--h;
do i = 1 to dim(num);
if vname(num(i)) = start then startindex=i;
if vname(num(i)) = stop then stopindex=i;
end;
do i = min(startindex,stopindex) to max(startindex,stopindex);
if missing(num(i)) then delete;
end;
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.