1. 程式人生 > >SAS學習︱邏輯庫、資料集建立與檢視、資料庫連結(SAS與R的code對照)

SAS學習︱邏輯庫、資料集建立與檢視、資料庫連結(SAS與R的code對照)

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~

———————————————————————————


入門學習一週,開始寫學習筆記。用習慣R之後,發現SAS程式相對python R還是有點繁雜。但是業務需要,不得不學一下。

程式碼部分大多來源於姚志勇老師的《SAS程式設計與資料探勘商業案例》。

——————————————————————————————————————————

一、邏輯庫、資料集、資料字典

資料字典>邏輯庫>資料集

邏輯庫=工作空間,儲存四類內容,test是資料集檔案,views是檢視(相當於R裡面的views點選檢視),formats代表檔案,sasmacr代表目錄內容。

資料集,包括資料檔案+SAS檢視,可以像R中雙擊獲取資料結構圖表,不過這樣效率較低,可以使用其他方法,譬如資料字典的方式describe view,詳細內容見三、資料檢視。

資料字典,是當年程序中所有內容的邏輯庫、資料表的一個平鋪、列出來。所以,在全域性檢索上十分有效。我覺得這個非常有用,不過貌似網上對其的定義比較少。

libname fv "F:\SAS\SAS 9.4 space";      /*fv是資料庫名字*/
data fv.forever;    /*  #forever代表在fv下的forever資料集*/
Input x y z;
Cards;             
1 2 3
4 5 6
;
run;

code解讀:

libname建立邏輯庫,相當於R中的workspace中的一個資料夾;

data代表資料表格,data.frame;

與R資料輸入不同的是,資料之間不是用逗號,而是空格來進行分割。

1、關於libname

如果,沒有libname步驟,直接,data,那麼就預設存放在SAS中的預設邏輯庫之中,預設邏輯庫名字叫“work”。

libname lb clear;       #刪除
代表刪除libname

2、關於資料字典

本節參考海納百川BLOG的:SAS資料字典訪問

訪問資料字典方法如下:

1.直接用SQL語句訪問Dictionary table
2.訪問SAShelp View

表名

包含資訊

檢視名

DICTIONARY.CATALOGS

SAS目錄冊及所包含的條目

SASHELP.VCATALG

DICTIONARY.COLUMNS

列(或變數)及其特徵

SASHELP.VCOLUMN

DICTIONARY.DICTIONARIES

所有表詞典

SASHELP.VDCTNRY

DICTIONARY.EXTFILES

檔案標識名和外部檔案物理儲存地址

SASHELP.VEXTFL

DICTIONARY.INDEXES

SAS資料集索引

SASHELP.VINDEX

DICTIONARY.MEMBERS

SAS資料集

SASHELP.VMEMBER

DICTIONARY.OPTIONS

目前設定的SAS系統選項

SASHELP.VOPTION

DICTIONARY.STYLES

ODS型別

SASHELP.VSTYLE

DICTIONARY.TABLES

SAS資料檔案和檢視

SASHELP.VTABLE

DICTIONARY.VIEWS

SAS資料檢視

SASHELP.VVIEW


/*資料字典把當前SAS環境中的所有內容進行彙總歸類到這個裡面,方便檢索*/
proc sql flow=10;
title2 'do the columns have formats,informats,or labels';
title3 'dictionary.columns';                                    
/*#所有表的列變數*/
create table colinf as
select name,type,length,label,format,informat                  
/*#變數名稱*/
from dictionary.columns
where libname='SASHELP' and memname='CLASS';
/*#注意要大寫	*/

開啟explorer window,在SASHELP這個library下,以V開頭的檢視實際上是Dictionary table內容的複製。如

proc sql;describe view sashelp.voption;quit;

   可以看到voption這個檢視的內容來自dictionary.options。   而對於View,除了SQL,直接用data步或proc步都可以訪問。如
data test2;
set sashelp.vcolumn;
where libname="WORK" and memname="TEST";
run;

或者
proc contents data=sashelp.voption;
run;或者在command欄輸入viewtable sashelp.voption。

——————————————————————————————————————————

二、SAS的資料匯入與其他平臺接入方式

SAS獲取資料的幾個方式:外部資料匯入、passthrough方式、import方式、input方式。大多通過libname來調入。

1、資料庫外部接入

/*#資料庫,外部接入*/
libname hsdb db2 user=xxuser password="xxxx" datasrc=datadb;
/*	#在邏輯庫hsdb中,db2代表資料庫名稱,datasrc代表SQL中的資料集名稱*/

還有RODBC訪問。

/*通過RODBC訪問 需要設定很多內容*/
libname odb odbc user=*** password=*** datasrc=test;
libname hsdb odbc noprompt="uid=xxxuser;pwd=xxxxx;dsn=datadb;" schema=hsuser

2、外部匯入,spss資料

/*SPSS資料集,外部接入*/
libname sps spss '';

3、oracle資料集,外部接入

/*oracle資料集,外部接入*/
libname oralib oracle user=xxx pw=xxx path dbmssrv schema=educ;

4、input方式匯入資料


input裡面有很多小符號,譬如@@ 和@的區別,$&。不過,也正是這些符號,讓我覺得... 導個數據也忒費勁了...不過,這個也是資料輸入中最複雜的問題了。。

關鍵就在這指標問題上,

@代表指標還在這行,只能罩著下一個input,如果沒有兩個input,那麼跟沒有@一樣,直接跳到下一行;接下來一個有,則相當於指標在這行;

@@代表指標一直在同一行;

沒有@,代表指標跳到下一行。

"$",表示字元型變數,&代表數值型。

data test;
    infile cards ;
    input x @;       /*單個@,能H住,有效期到下一個input語句*/
    input y;           /*沒有@,H不住,下一個input語句會去讀新的一行*/
    input z @@;    /*兩個@,H住沒問題,有效期延長到Data步下一圈*/
cards;
1 2 3
4 5 6
7
;
@只能在輸入資料“1 2 3”之後要換行輸入“4 5 6”才能被識別
@@可以無視這個,因為其關注“input xxx”,可以直接在cards;後輸入資料“1 2 3 4 5 6”,系統自動識別為兩組資料

參考百度文庫:

——————————————————————————

兩個都是行控制符(就是SAS閱讀你的資料時,在每一行裡面的閱讀數)

@  表示執行下一個操作時,指標移到下一個記錄(也就是下一行)。

@@表示執行下一個操作,指標保持在當前記錄(當前行)。

舉個例子:(資料錄入我使用兩種方式,以便於看出@與@@的閱讀區別)

(1):錄入資料時佔用一行的空間

data a;
  input x y @;(當僅僅使用一個@時)
  cards;
  1 2 3 4 2 2 3 5 3 2 1 1 (資料佔用一行空間)
  ;run;
proc print data=a;
run;


(閱讀結果如下)

data a: (此時SAS僅僅讀了1次,顯然沒有讀完,就跳到下一行閱讀下一個資料,因為下一行沒有資料可讀,所以就讀了一次就完了)

  The SAS System     17:52 Saturday, October 27, 2014  23
                                         Obs    x    y
                                          1     1    2
data b;
  input x y @@;
  cards;
  1 2 3 4 2 2 3 5 3 2 1 1 (資料佔用一行空間)
  ;run;
proc print data=b;
run;


(閱讀結果如下)

data b(此時SAS讀了6次,顯然這次是正確的,因為使用@@時,資料在當前行連續閱讀)
            The SAS System     17:52 Saturday, October 27, 2014  24
                                         Obs    x    y
                                          1     1    2
                                          2     3    4
                                          3     2    2
                                          4     3    5
                                          5     3    2
                                          6     1    1

(2):錄入資料時佔用多行空間

data a; (當僅僅使用一個@時)
  input x y @;
  cards;  1 2 3 4
2 2 3 5  (資料佔用三行空間)
         3 2 1 1
  ;run;
proc print data=a;run;


(SAS閱讀情況如下)

data a:(此時SAS僅僅讀了3次,顯然沒有讀完,因為每一行沒有連續讀完,就開始閱讀新下一個資料,也就是游標就跳到了下一行)
     The SAS System     17:52 Saturday, October 27, 2014  25
                                         Obs    x    y                                          
                                          1     1    2                                          
                                          2     2    2                                          
                                          3     3    2            

                              
data b;
  input x y @@;
  cards;
  1 2 3 4
  2 2 3 5
  3 2 1 1
  ;run;
proc print data=b;
run;


(SAS閱讀情況如下)

data b;(此時SAS閱讀了6次,顯然這次閱讀的閱讀時正確的,因為每一行都是連續讀取之後再讀取下一記錄,也就是跳到下一行)
           The SAS System     17:52 Saturday, October 27, 2014  26
                                                                                                
                                         Obs    x    y                                          
                                                                                                
                                          1     1    2                                          
                                          2     3    4                                          
                                          3     2    2                                          
                                          4     3    5                                          
                                          5     3    2                                          
                                          6     1    1            

——————————————————————————————————————————

三、資料檢視方式:content/data/proc sql三種方式

資料檢視也有很多方式,譬如content、data/proc sql包括雙擊也是一種方式,一共四種方式。

1、content方式

查詢資料的內容(summary)  針對一些標頭檔案裡面的隱藏資料集,可以用這樣的方式看到,類似summary,不過內容沒有那麼詳細。

proc contents data=fv.forever out=class;run;

out代表將查詢內容打印出來,並存放在臨時邏輯庫work之中。

2、data方式

data class/view=class1;
set fv.forever
;
run;

3、sql方式

proc sql;
create view class2 as
select*from fv.forever;
quit;

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~

———————————————————————————