2019年9月27日 星期五

[教學示範]「使用工具:SAS」解高中數學題_特殊的餘數

我們拿高中數學題目為教材,練習SAS基本語法。

例題:自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;

故有14個正整數合此條件,此14個正整數總合為6707

補充

針對資料集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;

沒有留言: