例題:自1至1000之正整數中,以6除之餘5,以8除之餘3,以9除之餘2,則此種正整數有多少個,又其和為多少?
ANS:
data math1; /*建立一個math1資料集*/
do i=1 to 1000; /*利用迴圈語法產生一個變項,其名稱為i,其觀察值為1至1000*/
output; /*迴圈每跑完一遍,就將所得傳送進math1資料集的i變項*/
end; /*跑完1000次後跳出迴圈結束此任務,記得,有幾個do就有幾個end,以後示範的例子會有大迴圈中,包著中迴圈,中迴圈中又包著小迴圈,即有3個do,3個end*/
run;
<只擷取部份>
data math2; /*將math1資料倒入math2資料集中*/
set math1;
m5=mod(i,6); /*新增m5變項,用來裝變項i除以6之後的餘數,mod就是一個抓餘數的函數*/
m3=mod(i,8);
m2=mod(i,9);
if m5=5 and m3=3 and m2=2 then aim=1; /*很白話,不解釋!把合題意的用aim=1挑出來*/
else aim=0;
run;
<只擷取部份>
/*將math2資料倒入math3空白資料集中,但合aim=1之觀察值才能倒入*/
data math3(where=(aim=1));
set math2;
run;
<全部內容>
proc univariate data=math3; /*以proc univariate對變項i輸出敘述性統計值*/
var i;
run;
補充
針對資料集math3,若要新增一個變項,此變項裝載變項i的總合,那如何處置?
ANS: 現在是要求算總合,也有可能是挑出最大值或最小值,此手法在資料清理加工階段非常好用,務必要會。
proc sql;
create table math4 as
/*proc sql程序結構源自資料庫語言SQL(註1),故此程序引用資料集不能用data=,須使用from, 另外,在sql世界中,它叫table資料表,不叫dataset資料集*/
select *, sum(i) as sum_i from math3; /*全抄math3所有變項,並再加一個新變項sum_i,其值為i的總合*/
quit; /*同上,此處不用run,要用sql中的quit*/
<全部內容>
註解
註1:結構化查詢語言SQL (Structured Query Language) 是關聯型數據庫管理系統的標準語言。
本篇文章完整語法
data math1;
do i=1 to 1000;
output;
end;
run;
data math2;
set math1;
m5=mod(i,6);
m3=mod(i,8);
m2=mod(i,9);
if m5=5 and m3=3 and m2=2 then aim=1;
else aim=0;
run;
data math3(where=(aim=1));
set math2;
run;
proc univariate data=math3;
var i;
run;
沒有留言:
張貼留言