簡體   English   中英

數據步驟中的宏變量

[英]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;

我認為這是行不通的,出於上述原因。 有解決方法嗎?

備注:

  1. 我簡化了這種情況,我正在研究的實際情況更加復雜(例如,變量不稱為t1,...t100而是結構更復雜的東西)。 如果可能的話,我想獲得與上述方法盡可能接近的方法,因為不同的解決方案可能不適用於我的情況。 當然,如果這不可能,那么任何解決方案都將受到歡迎!
  2. 我嘗試查看RESOLVE ,但是它似乎並沒有滿足我的要求(或者至少我不太了解它,無法使其滿足我的期望)。
  3. 作為最后的選擇,我可以嘗試使用兩個數據步驟來解決問題,一個步驟定義宏變量,另一個步驟使用它來檢查和刪除不需要的觀察值。 如果可能的話,我寧願避免這種解決方案。

更新:我按照解決方案中的建議使用數組解決了這個問題。

您正在嘗試使用dataset變量t_starti來確定要測試的變量。 那就是數組的目的。

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.

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