簡體   English   中英

SAS:如何在數據行上循環宏以更改為缺失

[英]SAS: How to loop a macro over rows of data to change to missing

任何人都可以幫助解決我遇到的這個問題,宏只獲取數據的最后一行值嗎?

我有一些看起來像這樣的數據:

data data1 ;  
  infile datalines dsd dlm='|' truncover;  
  input id :$2. year_age_15 EDU_2000 EDU_2001 EDU_2002 ;  
datalines4;  
10|2000|3|4|5  
11|2000|5|5|6  
12|2001|1|2|3  
13|2002|5|5|6  
14|2001|2|2|2  
15|2000|3|3|4   
;;;;  

但是,我需要它使用 year 變量來確定要保留哪些數據,然后將該值之后的年份的所有值更改為缺失,如下所示:

data data1 ;  
  infile datalines dsd dlm='|' truncover;  
  input id :$2. year_age_15 EDU_2000 EDU_2001 EDU_2002 ;  
datalines4;  
10|2000|3|.|.   
11|2000|5|.|.   
12|2001|1|2|.  
13|2002|5|5|6  
14|2001|2|2|.  
15|2000|3|.|.  
;;;;  

我一直試圖讓這個宏工作,但它只是間歇性地工作,只適用於數據的最后一行,而不是循環遍歷這些行。

%macro macro2 (output=, input=);  
data &output;  
set &input;  
%DO I = 1 %TO 6;  
%do; call symput('value2',trim(left(put(year_age_15,8.))));   
temp_col=&value2.;  
%let year_end=&value2.;  
%put YEAR END IS: &year_end.;  
%put EDU YEAR IS:  EDU_&year_end.;  
%do year = &year_end. %TO 2002;  
%put &year.;  
EDU_&year.=.;  
%end;  
%end;  
%end;  
run;  
%MEND macro2;  
%macro1(input=testset, output=output_testset);  

在 R 中,它可能很簡單,例如:
對於(我在 1:6){。 這樣做}

有什么建議嗎? 不知道是哪里出了問題,謝謝!

  1. 創建一個數組並按年索引它,而不是默認的 1:n

  2. 從 year+1 開始循環遍歷您的數組並設置為缺失

    data want; set data1; array educ(2000:2002) edu_2000-edu_2002; if (year_age_15 +1) <= hbound(educ) then do i= (year_age_15 +1) to hbound(educ); call missing(educ(i)); end; run;

所以,我認為這里的問題是您的數據處於錯誤的級別。 你當然可以按照 Reeza 的建議去做,我認為這樣做可能是合理的,但這有點復雜的原因是你的變量名中有數據。 這不是最佳實踐 - 您的變量名稱應該是“教育”,並且您的數據應該每年都有一行。 那么這將是一個簡單的 WHERE 語句!

這是一個簡單的PROC TRANSPOSE將其轉換為正確的結構,然后如果您真的需要它,第二個會將其轉回。 where語句可以在proc transpose中,也可以在其他地方使用。

proc transpose data=data1 out=data_t (where=(year_Age_15 ge input(scan(_NAME_,2,'_'),4.)));
  by id year_Age_15;
  var edu_:;
run;

proc transpose data=data_t out=want;
  by id year_age_15;
  id _name_;
  var col1;
run;

正如@Joe 提到的,匹配的年份是變量名稱的一部分,它會引起“元數據中的數據”的震顫

您可以使用VNAME檢索索引訪問的數組元素的變量名稱。 使用該功能與預期的變量名稱進行比較,同時基於名為EDU*的變量循環遍歷變量數組

例子:

data have ;  
  infile datalines dsd dlm='|' truncover;  
  input id :$2. year_age_15 EDU_2000 EDU_2001 EDU_2002 ;  
datalines4;  
10|2000|3|4|5  
11|2000|5|5|6  
12|2001|1|2|3  
13|2002|5|5|6  
14|2001|2|2|2  
15|2000|3|3|4   
;;;;

data want;
  set have;
  array edus edu_:;

  * find index of element corresponding to variable name having year;
  do _n_ = 1 to dim(edus) until (upcase(vname(edus(_n_))) = cats('EDU_',year_age_15));
  end;

  * fill in elements at indices post the found one with missing values;
  do _n_ = _n_+1 to dim(edus);
    call missing(edus(_n_));
  end;  
run;

在此處輸入圖像描述

暫無
暫無

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

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