[英]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:n
從 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.