2017年2月11日

SAS PROC SQL入門 (Part C)-Summary Functions

本篇主要介紹Summary Functions在SQL中的使用。
Summary Functions可以用來計算所有資料筆的函數,類似Proc Means的功能,但依據寫法也可能會如一般函數的結果。

常用的Summary Functions有Mean、Count、Max、Min等,其餘函數表列於下:

image

建立資料檔:

慣例,請先建立一個資料檔。

data score1;
input id score class $ @@;
datalines;
1 80 A
2 90 A
3 75 A
4 67 A
5 77 B
6 91 B
7 67 B
;
run;

Summary Functions(1):

依據Summary Functions在select語法中所放入的狀況,可分為「只有Summary Functions的指令」及「包含其他非Summary Functions的指令」,有點難理解的兩句話,先來看「只有Summary Functions的變項」的結果。

【程式1】

proc sql;
select mean(score) as AvgScore
from score1
;quit;

proc sql;
select mean(score) as AvgScore, max(score) as MaxScore
from score1
;quit;

image image

不論是【程式1】左欄或右欄的程式,在select之後均只有放入包含Summary Functions的指令,因此結果依據score1資料檔中的7筆資料進行計算,得到平均分數為78.1分,最小的為67分。

接下來看「包含其他Summary Functions的指令」的結果,於【程式2】

【程式2】

proc sql;
  select
   id,
   score,
   class,
   mean(score) as AvgScore,
   min(score) as MinScore
from score1
;
quit;

proc means data=score1 noprint ;
  var score;
  output out=test(drop=_type_ _freq_)
  mean=AvgScore min=MinScore;
run;

data test1;
  set score1;
  if _n_=1 then set test;
  keep id score class AvgScore MinScore;
run;
proc print data=test1;
run;

image image

【程式2】左欄加入了三個非Summary Functions的指令,分別為id, score,class,SQL如實將三個變項的結果列出,而後面兩個Summary Functions的指令則帶入全體的計算後的結果,也就是【程式1】的結果。如果要用傳統Data Step完成同樣工作所需要的語法則在【程式2】右欄。

Summary Functions(2):

Summary Functions和一般函數(Base SAS Functions)寫法相同,例如mean、min、max等,因此在撰寫程式時容易讓分析師困擾。例如在Summary Functions後是用多個參數時,結果會針對每觀察值數值作運算,也就是Summary Functions會和一般函數運算方式一樣。


【程式3】

proc sql;
  select mean(score, score+10) as AvgScore1
  from score1
;
quit;

proc sql;
  select mean(mean(score, score+10)) as AvgScore2
  from score1
;
quit;

image image

【程式3】左欄,mean函數中使用了兩個參數,得到結果不是7筆資料的平均,而是各觀察值的結果(以第1筆為例,計算過成為(80+(80+10))/2=85)。【程式3】左欄,mean函數外面在使用另一個mean函數,結果又回到7筆資料的平均,當然這不是原始資料的平均,而是mean(score, score+10) 後的平均值。


這次簡單介紹了Summary Functions,後續將持續介紹PROC SQL的重要指令,包括group by、order by、having等。

系列文章:

13 則留言:

  1. 回覆
    1. 好問題,不過C部分的瀏覽量明顯低於A或B,想說D就應該不需要了。
      好啦,重點是不知道要寫什麼QQ

      刪除
    2. 我來衝流量XD
      這對我幫助超大的,希望能有D部分。

      正在跑健保資料庫的人留

      刪除
    3. 感謝支持啊,但D要寫什麼(抱頭思考一下)

      刪除
    4. 希望可以出D呀~

      刪除
  2. data step是個隱含式迴圈,那請問proc SQL運作方式有差別嗎?

    回覆刪除
    回覆
    1. data step在pdv運作模式下,是逐筆的概念沒錯。

      SQL的處理方式我就沒有那麼清楚了,但也因為運作模式不同,在需多狀況下SQL會非常的有效率,這需要在個不同情境實用後,才可以知道差異。

      刪除
  3. 回覆
    1. 感謝您的支持,也是有緣,因為C部分的已經沒什麼瀏覽量了。

      刪除
  4. 希望能有D的部分~~拜託

    回覆刪除
    回覆
    1. 感謝您的支持,我在想想有什麼好發揮的好了

      刪除
  5. 非常謝謝版主的教學!希望之後還能看到PROC SQL其他的重要指令

    回覆刪除