2015年12月21日 星期一

SAS 的 Data step 與 Proc SQL


文獻1:Malachy J. Foley. "MERGING vs. JOINING: Comparing the DATA Step with SQL" SUGI 30.

圖一


data step merge 
... ...
MERGE  one (IN=in1) two (IN=in2); BY id ;
IF 條件設定;
RUN;




重點摘要:
  • 各個資料檔的主 id 沒有重覆, Match-merge的情況下 data step merge 與 SQL JOIN可以有相同的產出。data step merge  的各種條件設定,與相對應的 SQL JOIN 說明如下:
    ABC區    IF in1 = 1 or in2 = 1;        相當於 SQL 的 FULL OUTER JOIN。
    AB   區    IF in1 = 1                ;        相當於 SQL 的 LEFT OUTER JOIN。
      BC 區    IF                 in2 = 1;        相當於 SQL 的 RIGHT OUTER JOIN。
      B   區    IF in1 = 1 AND  in2 = 1;        相當於 SQL 的 INNER JOIN。

  • SQL JOIN 主要分二類:INNER、OUTER,其執行機制來於 CARTESIAN PRODUCT。 OUTER JOIN 又可分三類 FULL OUTER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN,在寫程式時, OUTER 這個字可以省略(如 FULL JOIN)。
  • CARTESIAN PRODUCT (圖二)沒有  ON key-field-condition
    基本上如果 one 有3筆,two有2筆,three有2筆,其結果就是 3 * 2 * 2 = 12筆
    以SQL來寫,
    PROC SQL;
      CREATE TABLE allrecord AS
      SELECT *
      FROM one, two, three
    ;
    QUIT;
圖二

  • INNER JOIN的兩種寫法(概念如圖一),有  ON key-field-condition
    PROC SQL;
      CREATE TABLE both AS
      SELECT *
      FROM one INNER JOIN two
      ON one.id = two.id
    QUIT;

    PROC SQL;
      CREATE TABLE both AS
      SELECT *
      FROM one, two
      WHERE one.id = two.id
    QUIT;
  • OUTER JOIN 也是有 ON key-field-condition,主 key 最好要另加上coalesce () ,如:SELECT coalesce (one.id , two.id) AS new_id。
    • 若只要 A 區(有 one但不含 two)
      SQL可用
          LEFT JOIN ... ...
          ON ... ...
          WHERE two.id  IS  NULL
      data step 可用  IF in1 = 1 AND  in2 = 0;

      若只要 C 區(有 two但不含 one)
      SQL可用
          RIGHT JOIN ... ...
          ON ... ...
          WHERE one.id  IS  NULL
      data step 可用  IF in1 = 0 AND  in2 = 1;

      若只要 AC 區(排除 B,即排除one與 two的聯集)
      SQL可用
          FULL OUTER JOIN ... ...
          ON ... ...
          WHERE one.id  IS  NULL OR  two.id  IS  NULL
      data step 可用  IF in1 +  in2 = 1;


文章最後有用 data step 作 CARTESIAN PRODUCT 的範例,如下
DATA CART ;
SET one  (rename=(ID=ID1));
    DO i=1 TO kkk;
        SET two point=i  nobs=kkk;    OUTPUT;
    END;
RUN;

原則上就是分兩次 SET,並且在第2次時,搭配 do-output-end,最重要的還有 point 與 nobs 的指令,我猜似它的用途為
1、nobs 得到 two 有幾筆資料,並匯到 變項 kkk裡,而 kkk剛好告訴 DO loop 何時要停整。
2、point 很重要的,但無解,不懂。

2015年3月4日 星期三

Subseting

Subseting Matrix

[列,欄] 或 [列名,欄名]
預設結果為vector。

> x <- matrix(1:6, 2, 3)
> dimnames(x)<-  list(c("1st", "2nd") ,c("C1", "C2" , "C3") )
> x[1, ]
C1 C2 C3 
 1  3  5 
> x["1st",]
C1 C2 C3 
 1  3  5 
> x[1, , drop=FALSE]
     C1 C2 C3
1st  1  3  5

不可用 $欄名 ,$列名


Subseting Data.frame

[列,欄] , ["列名","欄名"] , $欄名 ,$列名,
預設結果為 vector。 以下都是 [1] 5 6

> x2<- data.frame(x) #**轉成 tabular **
x2[,3]
x2[,"C3"]
x2$C3

簡寫版 [ 欄 ] 或 [ "欄名" ]
結果是 data.frame

> x2[3]
> x2["C3"]
     C3
1st  5
2nd  6

但是, [[ 欄 ]] 或 [[ "欄名" ]] 就可以轉成 vector

x2[[3]]
x2[["C3"]]

Subseting List

[ 序位 ] 或 [ "名稱" ]
結果是 list
$foo
[1] 1 2 3 4

x <- list(foo = 1:4, bar = 0.6) 
attributes(x)  
class(x)  
x[1]
x["foo"]

[[ 序位 ]] 或 [[ "名稱" ]] 或 $名稱
結果都是vector
[1] 1 2 3 4

x$foo
x[[1]]
x[["foo"]]

簡寫版,給開頭名稱就可 x[["f", exact=FALSE]]

[[ 第 n 元素 ]] [第 i 個]
結果都是vector

> x[[1]][2]
[1] 2

所有元素的第 i 個,要寫function
> secondElement <- function(x){x[1]} > sapply(x,secondElement) foo bar baz "1" "0.6" "hello"

由 Data.frame 轉成 List
按月就有一個元素,元素裡是dataframe

library(datasets)
head(airquality)
s <- split(airquality, airquality$Month) 

s[[1]][1] 結果是dataframe
s[[1]][[1]] 結果是 vector


Subseting

jsonData$name=="datasharing"

[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [25] FALSE FALSE FALSE FALSE FALSE FALSE

jsonData[jsonData$name=="datasharing", ]$createdat
[[1]] [1] "2013-11-07T13:25:07Z"
jsonData[with(jsonData, name=="datasharing" ), "created
at" ]
[[1]] [1] "2013-11-07T13:25:07Z"

jsonData[with(jsonData, name=="datasharing" ), 45 ]
[[1]] [1] "2013-11-07T13:25:07Z"


Removing NA Values

is.na() 用於單個變項

nrow(airquality) # 153
air2<-airquality[!is.na(airquality[[1]]),]
nrow(air2) # 116 筆 第1欄無NA

complete.cases() 用於整個資料檔

air3<-airquality[complete.cases(airquality),]
nrow(air3) # 111筆 完整的資料

多個資料檔同時check,要注意資料量相同

Ozone<-airquality[[1]]
Solar.R<-airquality[[2]]
Wind<-airquality[[3]]
sum( is.na(Ozone) | is.na(Solar.R) | is.na(Wind) )
[1] 3檔案中,共 42 筆有任一NA, 即 111筆完整資料

good<-complete.cases(Ozone,Solar.R,Wind)
sum(good)
[1] 111 筆完整資料
sum(!good)
[1] 42 筆有任一NA



簡例

指標的平均值,按月份

以Tapply,每月 1 個指標,結果為array

tapply(airquality[,"Ozone"], airquality$Month, function(x){mean(x, na.rm=TRUE)}
     )   
 5        6        7        8        9   
23.61538 29.44444 59.11538 59.96154 31.44828

以split 與 lapply,每個月可 N 個指標,結果為list

s <- split(airquality, airquality$Month)   
lapply(s, function(x){
  colMeans( x[, c("Ozone", "Solar.R", "Wind")], na.rm=TRUE )} 
     )

$`5`
Ozone     Solar.R     Wind 
 23.61538 181.29630  11.62258   
$`6`
Ozone     Solar.R     Wind 
 29.44444 190.16667  10.26667 

2015年1月19日 星期一

書單


Business Management Driven by Data Analytics

決策分析與管理:紫式決策分析以全面提升決策品質(第二版)
作者: 簡禎富
出版社:雙葉書廊
出版日期:2014/08/19

異數:超凡與平凡的界線在哪裡?
Outliers: The Story of Success (2007)
作者: 麥爾坎.葛拉威爾
原文作者:Malcolm Gladwell
譯者:廖月娟
出版社:時報出版
出版日期:2009/01/19

魔球:逆境中致勝的智慧【經典新版】
作者: 麥可‧路易士
原文作者:Michael Lewis
譯者:游宜樺
出版社:早安財經
出版日期:2014/09/04

黑天鵝效應(擴充新版)
The Black Swan: The Impact of the Highly Improbable (2007)
作者: 納西姆.尼可拉斯.塔雷伯
原文作者:Nassim Nicholas Taleb
譯者:林茂昌
出版社:大塊文化
出版日期:2011/06/27

魔鬼都在數據裡
Competing on Analytics (2007)
作者: 戴文坡, 哈瑞斯
原文作者:Thomas H. Davenport,Jeanne G. Harris
譯者:胡瑋珊
出版社:中國生產力中心
出版日期:2008/03/05

什麼都能算,什麼都不奇怪:超級數據分析的祕密
Super Crunchers:Why Thinking-by Numbers Is the New Way to Be Smart (2008)
作者: 伊恩.艾瑞斯
原文作者:Ian Ayres
譯者:張美惠
出版社:時報出版
出版日期:2008/10/30

洞悉價格背後的心理戰:訂價不是數學而是心理學,開價、議價、談判的技術
Priceless: The Myth of Fair Value (2011)
作者: 威廉.龐士東
原文作者:William Poundstone
譯者:連緯晏
出版社:大牌出版
出版日期:2014/09/03

DRILLING DOWN: Turning Customer Data into Profits with a Spreadsheet - Third Edition Paperback – June 18, 2004
Jim Novo
ISBN-13: 978-1591135197 ISBN-10: 1591135192


2015年1月5日 星期一

應用APA 格式



匯入 Journals Term List
http://www.csis.com.tw/e-AN0908/e-AN1021FAQ_h1.asp


線上查詢 Jounal 全名,縮寫
http://www.ncbi.nlm.nih.gov/nlmcatalog/