SAS 9.4 Base Programming – Performance Based Exam

SAS編程基本概念

1、SAS邏輯庫

??SAS邏輯庫是一個或多個SAS文件的集合,用于組織、查找和管理SAS文件。

2、邏輯庫引用名

??在定義SAS邏輯庫時需要指定邏輯庫引用名,臨時邏輯庫WORK除外。
SAS邏輯庫 用名的命名規(guī)范如下:
?最大長度是8個字符。
?必須以字母(從A到Z,大小寫均可)或下劃線(_)開始。
?可以是數(shù)字(0-9)、字母和下劃線(_)的任意組合。

3、邏輯庫引擎

??SAS邏輯庫引擎是SAS軟件和SAS邏輯庫之間的接口軟件組件,每個SAS邏輯庫都關(guān)聯(lián)一種邏輯庫引擎。
??邏輯庫引擎可分為原生邏輯庫引擎接口邏輯庫引擎。

4、SAS數(shù)據(jù)集命名

數(shù)據(jù)集名稱遵守SAS命名規(guī)則:
?最大長度為32字符。
?必須以字母(從A到Z,大小寫均可)或下劃線(_)開始。
?可以是數(shù)字、字母和下劃線(_)的任意組合。

5、變量屬性

??SAS數(shù)據(jù)集變量的屬性包括變量名、類型、長度、輸出格式(format)、輸入格式(informat)和標(biāo)簽(label)。
每個變量的變量名必須遵守SAS命名規(guī)范:
?最大長度為32字節(jié)。
?必須以字母(從A到Z,大小寫均可)或下劃線(_)開始。
?可以是數(shù)字、字母和下劃線(_)的任意組合。
??變量的長度與類型有關(guān)。字符變量的長度可以在定義時給出,否則其長度為第一次賦值時值的長度,最大長度可到32K。數(shù)字型變量的默認(rèn)長度是8個字節(jié),也可以指定不同的長度。
??格式(format)會影響數(shù)據(jù)值寫出的方式。
??輸入格式(informat)指定數(shù)據(jù)值以特定的格式讀入,從而成為標(biāo)準(zhǔn)的SAS值。在讀取包含字母或其他特殊字符的數(shù)字值時必須使用輸入格式。
??變量都可以有標(biāo)簽(label)。標(biāo)簽通常是描述該變量的文本,最大長度為256個字符。

DATA步讀取數(shù)據(jù)

原始數(shù)據(jù)一般分為字符和數(shù)值兩種類型,數(shù)值數(shù)據(jù)又分為標(biāo)準(zhǔn)數(shù)值數(shù)據(jù)和非標(biāo)準(zhǔn)數(shù)值數(shù)據(jù)。
標(biāo)準(zhǔn)數(shù)據(jù)是由字符或者數(shù)值組成的可以被列表、列、格式化、命名輸入方式讀入的數(shù)據(jù),如Male,1166.42。
非標(biāo)準(zhǔn)數(shù)據(jù)只能在輸入格式的幫助下讀入的數(shù)據(jù)。如非標(biāo)準(zhǔn)的數(shù)值數(shù)據(jù),可能包含逗號,空格等符號。日
期和時間數(shù)值。十六進(jìn)制和二進(jìn)制數(shù)值。
標(biāo)準(zhǔn)數(shù)值數(shù)據(jù)只包含數(shù)字,小數(shù)點或負(fù)號。
非標(biāo)準(zhǔn)數(shù)值數(shù)據(jù)則包含其它的特殊字符,如千分號,美元符號等。

1、DATA步處理

??DATA步由一組SAS語句組成。首先,會由DATA語句創(chuàng)建并命名SAS數(shù)據(jù)集;然后SAS會編譯并檢查其語句的語法,如果語法正確,這些語句會被執(zhí)行。在DATA步中可以使用DATALINES直接輸入數(shù)據(jù)或通過INFILE語句指定原始數(shù)據(jù)文件。
下面給出了一個典型的DATA步讀取外部文件的處理流程:、
(首先創(chuàng)建數(shù)據(jù)集)
編譯DATA步中的SAS語句并檢查語法。
創(chuàng)建輸入緩沖區(qū)、程序數(shù)據(jù)向量PDV(Program Data Vector)和數(shù)據(jù)集描述信息。
從DATA語句開始執(zhí)行。
將PDV中所有變量值(除自動變量NERROR)置為缺失值。
判斷是否有數(shù)據(jù)要讀入?有數(shù)據(jù)要讀入,進(jìn)行下一步。如果沒有,關(guān)閉數(shù)據(jù)集。
將數(shù)據(jù)讀入輸入緩沖區(qū),并賦值給PDV中的變量。
執(zhí)行其他可執(zhí)行語句。
將觀測寫入SAS數(shù)據(jù)集。
返回DATA步開始下一個迭代,從第3步開始。

2、讀取外部文本文件中的數(shù)據(jù)(初級)

關(guān)于input的columninput (列輸入)和listinput (列表輸入)
簡單來說:列輸入就是嚴(yán)格按照變量指定的長度進(jìn)行數(shù)據(jù)讀取,忽略分隔符;列表輸入就是根據(jù)規(guī)定的分隔符(默認(rèn)是空格)按照變量的順序讀取數(shù)據(jù),多個空格按照一個處理,遇到空格即停止。

使用DATA步讀取外部文件中數(shù)據(jù)的基本形式如下:

DATA 數(shù)據(jù)集名稱;
    INFILE 數(shù)據(jù)文件位置;
    INPUT 變量列表;
RUN;

FILENAME 文件引用 外部文件|外部文件存儲位置;

1) FILENAME語句指定到單個文件的文件引用:
filename invtfile 'c:\sas\data\inventory.dat':指定一個文件的位置
data saslib.Inventory;
     infile invtfile;
     input Product_ID $ Instock Price;
run;
 2) FILENAME語句指定到一組外部文件存儲位置的文件引用:指定一個文件夾的位置
filename extfiles 'c:\sas\data';
data saslib.Inventory;
     infile extfiles(inventory);
     input Product_ID $ Instock Price;
run;

列表輸入方式
列表輸入(List Input)用于讀取原始數(shù)據(jù)記錄中每個字段由至少一個分隔符隔開,并且數(shù)據(jù)值中不包含該分隔符的原始數(shù)據(jù)。
DATA 數(shù)據(jù)集; INFILE 文件引用; INPUT 變量1 <$> <變量2 <$> …>; RUN;
上述的列表輸入代碼存在如下限制:
?使用列表輸入時,字符變量長度默認(rèn)為8個字節(jié)。當(dāng)輸入數(shù)據(jù)長度超過8個字節(jié)時,從輸入緩沖區(qū)讀入PDV的數(shù)據(jù)值會產(chǎn)生截斷。這個問題可以通過在INPUT語句之前使用LENGTH語句指定該變量的長度或其他方式來解決。
?SAS遇到空格時會停止讀入當(dāng)前數(shù)據(jù)值,這樣SAS就不能處理原始數(shù)據(jù)記錄中的數(shù)據(jù)值包含空格的情況了。
?原始數(shù)據(jù)中必須使用占位符(.)來表示該數(shù)據(jù)值為缺失值。

LENGTH 語句
通常在變量第一次出現(xiàn)時程序會根據(jù)上下文環(huán)境確定其長度。可以在INPUT語句前通過LENGTH語句明確指定變量長度。 LENGTH 變量1 <$>長度 <變量2 <$>長度 …>;

DLM選項
當(dāng)原始數(shù)據(jù)中數(shù)據(jù)記錄的數(shù)據(jù)值未使用空格,而是使用其他分隔符時,需在INFILE語句中使用DLM=選項,告訴SAS讀入數(shù)據(jù)時需要使用的分隔符。 infile extfiles(inventory_dlm) dlm=',';
兩個連續(xù)DLM指定的分隔符會被當(dāng)作一個分隔符處理,若分隔符之間是空格,則空格會當(dāng)作缺失數(shù)據(jù)被讀入變量寫進(jìn)數(shù)據(jù)集。

DSD選項
指定選項DSD后,如果數(shù)據(jù)值是由引號引起來的,可以將數(shù)據(jù)值中的分隔符當(dāng)成是數(shù)據(jù)值的一部分讀入,字符值中的引號在讀入PDV時會被刪除。DSD選項將默認(rèn)的分隔符設(shè)置為逗號,還改變了使用列表輸入時SAS處理分隔符的方式,比如,如果有兩個連續(xù)的逗號,將被當(dāng)作缺失值。 infile extfiles(customer_dsd) dsd;
選項DSD還可以和其他選項(例如DLM=和DLMSTR=)一起使用。DLM=在上面介紹過,DLMSTR=用于指定分隔數(shù)據(jù)值的字符串。

按列輸入方式
使用列輸入時一定要注意指針的位置,此時不再是空格為分隔符了,以指針具體位置讀取數(shù)據(jù)
當(dāng)原始數(shù)據(jù)記錄中的數(shù)據(jù)值在每條記錄中占據(jù)相同的列時,可使用按列輸入的方式。按列輸入(Column Input)可以讀取固定列的數(shù)據(jù)。
該讀入方式的INPUT語句基本形式如下: INPUT 變量1 <$> 開始列<-結(jié)束列> <變量2 <$>開始列<-結(jié)束列> …>;

input Customer_ID $ 1-4  Name $ 6-19 Address $ 21-37 City $ 39-51 State $ 53-54 ;

在上述形式中:

  • 變量名后有$表示該變量為字符型變量。
  • 開始列-結(jié)束列指定變量在原始數(shù)據(jù)記錄中所處的位置。
  • 變量長度由為該變量指定的列數(shù)確定,可以超過8個字節(jié)。
  • 按列輸入可讀入包含空格的數(shù)據(jù)值。
  • 可以處理數(shù)據(jù)中的缺失值,不需要使用占位符。

格式化輸入方式
使用格式化輸入時一定要注意指針的位置,此時不再是空格為分隔符了,以指針具體位置讀取數(shù)據(jù)
即在INPUT語句中提供特殊的指令,以便SAS正確地讀取原始數(shù)據(jù)記錄中的數(shù)據(jù)值。這些特殊指令稱為輸入格式(Informat)。格式化輸入組合了按列輸入特征和讀取非標(biāo)準(zhǔn)化數(shù)字或字符值的能力,保證數(shù)據(jù)值可正確地從原始數(shù)據(jù)記錄中讀入。
對單個變量,格式化輸入的INPUT語句的基本形式如下: INPUT 變量 <$> 輸入格式;

常用數(shù)字和字符輸入格式


image.png

常用的SAS日期、時間、日期時間輸入格式


image.png

帶修飾的列表輸入方式
使用帶修飾的列表輸入方式,存在格式化輸入的情況,只要格式后加上修飾符,SAS仍然以分隔符讀取數(shù)據(jù)
&修飾符(ampersand format modifier):使用列表輸入時,該修改符能夠讀入數(shù)據(jù)值中包含一個或多個嵌入空格的字符值,并指定字符的輸入格式。SAS讀入數(shù)據(jù)直到遇到兩個連續(xù)的空格、或達(dá)到所定義的數(shù)據(jù)長度或輸入行結(jié)束才停止。&修飾符解決了使用列表輸入方式讀取數(shù)據(jù)值中包含嵌入空格的問題,但要求該包含空格的數(shù)據(jù)值與下一個數(shù)據(jù)值之間至少間隔兩個空格。
:修飾符(colon format modifier):使用列表輸入時,該修改符可以在變量名后指定輸入格式。SAS讀入數(shù)據(jù)直到遇到空列、達(dá)到所定義的數(shù)據(jù)長度(對字符型變量來說)或輸入行結(jié)束才停止。:修飾符可以讀取超過8個字節(jié)的字符數(shù)據(jù)和包含特殊字符的數(shù)字字符。
~修飾符(tilde forat modifier):可以讀入并保持?jǐn)?shù)據(jù)值中的單引號、雙引號和分隔符。

命名輸入方式
命名輸入(named input)讀取包含變量名、等于符號和變量值的輸入數(shù)據(jù),例如Name= Willam。
命名輸入的基本形式如下: INPUT 變量1= <$> <變量2= <$> …>; input Customer_ID $ Name= $ Age=;
一旦INPUT語句開始使用命名輸入方式,接下來的數(shù)據(jù)值則必須也是命名形式。

混合輸入方式
混合輸入方式,存在格式化輸入的情況,只要格式后加上修飾符,SAS仍然以分隔符讀取數(shù)據(jù),若存在格式化未加修飾符,則整個數(shù)據(jù)以指針位置讀取

3、讀取外部文本文件中的數(shù)據(jù)(高級)

在創(chuàng)建SAS數(shù)據(jù)集時,根據(jù)數(shù)據(jù)文件的格式,經(jīng)常會需要使用更加高級的特征來正確有效地將原始數(shù)據(jù)文件的記錄(或行)轉(zhuǎn)換為數(shù)據(jù)集。例如:

  • 對原始數(shù)據(jù)記錄中的數(shù)據(jù)長度不夠INPUT語句中所有變量讀取的情況進(jìn)行處理;
  • 在創(chuàng)建SAS數(shù)據(jù)集的觀測前先測試條件是否成立;
  • 在單條數(shù)據(jù)記錄中創(chuàng)建多個觀測;
  • 從多個原始數(shù)據(jù)記錄中創(chuàng)建單條觀測;

INFILE語句的高級選項

  • FLOWOVER:INPUT語句會讀入下一條記錄到輸入緩沖區(qū)中,給當(dāng)前PDV中未賦值的變量賦值。
  • MISSOVER:會在DATA步的本次迭代中阻止INPUT語句讀入原始數(shù)據(jù)的下一條記錄,并將PDV中所有未賦值的變量保持為缺失值(PDV中變量未賦值時就為缺失值)。當(dāng)原始數(shù)據(jù)記錄中的最后一個或多個字段沒有值,并且希望SAS將對應(yīng)的變量置為缺失值時使用MISSOVER。(針對一行數(shù)據(jù)最后的數(shù)據(jù)不存在時)
  • TRUNCOVER:也會阻止INPUT語句讀入原始數(shù)據(jù)的下一個記錄,但對于當(dāng)前正在讀入的變量,當(dāng)輸入緩沖區(qū)中的數(shù)據(jù)長度少于當(dāng)前變量要求的長度時,則將當(dāng)前輸入緩沖區(qū)中的數(shù)據(jù)賦值給PDV中的該變量。所有未賦值的變量置為缺失值。(針對列輸入時某個數(shù)據(jù)長度超過該變量定義長度的情況)
  • STOPOVER:DATA步的執(zhí)行會停止。當(dāng)INPUT語句在當(dāng)前輸入行找不到所有數(shù)據(jù)值時,如果在INFILE語句中使用選項STOPOVER,SAS會停止執(zhí)行該DATA步。

MISSOVER與TRUNCOVER的不同之處在于,如果當(dāng)前變量沒有讀到要求長度的數(shù)據(jù),MISSOVER會將當(dāng)前變量的值也置為缺失值。(MISSOVER僅在列輸入時,未達(dá)到要求長度的數(shù)據(jù)會被設(shè)為缺失,在列表讀入時不會出現(xiàn)這種情況)

若在列輸入中加入MISSOVER,如果指針到了一行的結(jié)尾,仍然沒能讀入滿足變量長度的數(shù)值,就會將該變量變?nèi)笔?。解決方法:可以再加入pad選項,pad選項數(shù)據(jù)后面填上空格,使得每行的長度相同,默認(rèn)lrecl=256。
若在列表輸入中加入MISSOVER,不會像列輸入那樣將最后的變量變?nèi)笔А?br> 關(guān)于PAD,pad固名思義,意思是將數(shù)據(jù)行的后面部分填上空格,這樣就使得數(shù)據(jù)行變長,不致于讓input指針在讀取短數(shù)據(jù)行時到達(dá)數(shù)據(jù)行結(jié)尾從而跳行。

系統(tǒng)選項LRECL和INFILE選項PAD
選項LRECL為系統(tǒng)選項,指定用于讀寫外部文件的默認(rèn)邏輯記錄長度。
PAD和NOPAD選項控制SAS是否使用空格對從外部文件讀入的記錄進(jìn)行填充,使其達(dá)到選項LRECL=指定的長度。默認(rèn)設(shè)置為NOPAD。

INPUT語句的行控制符和行保持符

  • 行保持符
  • 行指針控制

通過IMPORT過程讀取外部文件數(shù)據(jù)

IMPORT過程的導(dǎo)入數(shù)據(jù)的基本形式如下:

PROC IMPORT
    DATAFILE=文件名|文件引用 | DATATABLE=表名 #DATAFILE=指定輸入文件的完整路徑和文件名,或文件引用。
    DBMS=數(shù)據(jù)源標(biāo)識符
    OUT=數(shù)據(jù)集名稱;
RUN;

1、讀取CSV文件 DBMS = CSV

2、讀取 Microsoft Excel 工作薄 DBMS = XLSX

SAS程序錯誤及處理

單個數(shù)據(jù)集處理(一):如何選取部分變量

1、選項KEEP=和DROP=和KEEP和DROP語句

先來理解一下它們在執(zhí)行過程中的不同之處。在DATA步中,SET語句會將數(shù)據(jù)讀入到程序數(shù)據(jù)向量PDV中。在SET語句中使用數(shù)據(jù)集選項時,只有選取的變量才會被讀入到PDV,最后寫入新數(shù)據(jù)集。而使用KEEP和DROP語句來選取變量時,SET語句會將原數(shù)據(jù)集中的所有變量讀入到PDV,然后再通過相應(yīng)的KEEP和DROP語句進(jìn)行選取并寫入新數(shù)據(jù)集。所以數(shù)據(jù)集選項KEEP=和DROP=會控制讀入程序數(shù)據(jù)向量PDV中的變量,使用數(shù)據(jù)集選項通常會更有效率。

Access and Create Data Structures

Create temporary and permanent SAS data sets.

1、DATA + SET語句

/*創(chuàng)建臨時數(shù)據(jù)集*/
data ;
  set sashelp.class;
run;

/*一次創(chuàng)建多個數(shù)據(jù)集*/
data class1 class2;
  set sashelp.class;
run;

/*不生成數(shù)據(jù)集*/
data _NULL_;
  set sashelp.class;
run;

2、SQL+CREAT語句

/*創(chuàng)建一個和SASHELP.CLASS一樣的數(shù)據(jù)集*/
proc sql;
  creat tmp as
  select * 
  from sashelp.class;
quit; 

Investigate SAS data libraries using base SAS utility procedures.

1、Use a LIBNAME statement to assign a library reference name to a SAS library.

LIBNAME語句訪問DBMS數(shù)據(jù)文件語法參考卡片
LIBNAME語句訪問PC文件語法參考卡片
/*針對Base引擎,engine-name可以省略*/
Libname mydata "D:\SASdata";  要求: D:\SASdata目錄必須已經(jīng)存在

/*用libname輸入xlsx多個sheet的數(shù)據(jù)集*/
libname myxlsx excel 'INPUTxlsx.xlsx';
run;

讀xlsx的第3個sheet;
感覺70題上面的方法太老了,這樣也是可以的:

libname myxlsx xlsx 'input01.xlsx';
proc contents data=myxlsx._all_;run;  

這樣可以將所有myxlsx上面的數(shù)據(jù)集內(nèi)容打印出來

proc print data = myxlsx.'SHEETBB$'n;
run;

從上面打印出來的內(nèi)容中查看你每個表的名字,就可以打印某一個表啦

2、Investigate a library programmatically using the CONTENTS procedure.

  • detials|nodetials(縮寫NODS):用于控制顯示結(jié)果的詳盡程度。前者將顯示上述的全部內(nèi)容,后者則僅顯示有關(guān)變量信息的部分。默認(rèn)設(shè)置: detials(WARNING: 選項 NODS 只能與 _ALL_ 一起使用。)
  • varnum :要求將變量按照其在數(shù)據(jù)集中的排列順序而非字母順序顯示。
  • short :有關(guān)變量信息部分僅顯示變量名稱,不顯示變量屬性。
  • out= :將輸入數(shù)據(jù)集中有關(guān)變量的信息存儲到指定的數(shù)據(jù)集中。
  • noprint :禁止程序運行結(jié)果在output窗口的輸出顯示。
/*輸出數(shù)據(jù)集sashelp.class的信息,保存到數(shù)據(jù)集a中*/
proc contents data=sashelp.class out=a;
run;

Access data.

1、Access SAS data sets with the SET statement.

2、Use PROC IMPORT to access non-SAS data sources.

PROC IMPORT語法參考卡片
  • Read delimited and Microsoft Excel (.xlsx) files with PROC IMPORT
/*PROC IMPORT讀入ecxel文件到work邏輯庫*/
filename myexcel '***.xlsx';
proc import datafile = myexcel out = work.myexcel 
  dbms = excel replace;
  getnames = yes;   # xlsx文件不能用guessingrows = max;
run;

proc import datafile = '***.xlsx' out = work.myexcel 
  dbms = excel replace;
  getnames = yes;
  guessingrows = max;
run;

/*PROC IMPORT讀入CSV文件到work邏輯庫*/
filename mycsv '***.csv';
proc import datafile = mycsv out = work.mycsv
  dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

/*PROC IMPORT讀入TXT特殊字符分隔得文件到work邏輯庫*/
/*制表符分隔,二進(jìn)制為‘09’x*/
filename mytxt1 '***.txt';
proc import datafile = mytxt1 out = work.mytxt1
  dbms = dlm replace;
  delimiter = '09'x;
  getnames = yes;
  guessingrows = max;
run;

/*空格分隔,二進(jìn)制為‘20’x*/
filename mytxt2 '***.txt';
proc import datafile = mytxt3 out = work.mytxt2
  dbms = dlm replace;
  delimiter = '20'x;
  getnames = yes;
  guessingrows = max;
run;

/* ‘#’分隔符*/
filename mytxt3 '***.txt';
proc import datafile = mytxt3 out = work.mytxt3
  dbms = dlm replace;
  delimiter = '#';
  getnames = yes;
  guessingrows = max;
run;

Combine SAS data sets.

1、Concatenate data sets.

/*創(chuàng)建測試數(shù)據(jù)集*/
data class1(keep = name sex) class2(keep = age height weight);
  set sashelp.class;
  output class1;
  output class2;
run;

/*橫向連接*/
data class;
  set class1;
  set class2;
run;
采用多SET語句橫向連接讀入時,有幾個需要留意的事項:
(1)用多SET語句并接多個數(shù)據(jù)集,當(dāng)數(shù)據(jù)集里面的觀測數(shù)不等時,SAS讀完觀測數(shù)最少的那個數(shù)據(jù)及后即停止執(zhí)行。因此生成的數(shù)據(jù)集的觀測數(shù)等于數(shù)據(jù)集里最少的觀測數(shù)。
(2)當(dāng)多個數(shù)據(jù)集里的變量有重復(fù)時,后面的值會覆蓋前面的值。

/*眾向連接*/
data class;
  set class1 class2;
run;

例題:

  1. The Excel workbook REGIONS.XLS contains the following four worksheets:
    EAST
    WEST
    NORTH
    SOUTH
    The following program is submitted:
    libname MYXLS ’regions.xls’;
    Which PROC PRINT step correctly displays the NORTH worksheet?


Explanation
Answer: D 其實這道題考察的是SAS讀取非SAS數(shù)據(jù)源。 看看答案,四個答案里面差異在于符號$以及E和N的差別。 以下是SAS PAPER里面的解釋: 我覺得最關(guān)鍵的就是SAS LIBNAME建立的是以XLS為數(shù)據(jù)源的邏輯庫時,創(chuàng)建了兩個數(shù)據(jù)源,一個是spreadsheet 另外一個是 named range(指定范圍的數(shù)據(jù))。 我們在輸出整個數(shù)據(jù)時候,應(yīng)該是spreadsheet,而不是相對指定的范圍的數(shù)據(jù)。制定范圍的數(shù)據(jù),其實熟悉EXCEL應(yīng)該知道,就是我們選擇部分?jǐn)?shù)據(jù)作為我們要分析的對象,用 鼠標(biāo)拖動即可產(chǎn)生制定范圍的數(shù)據(jù)。

2、Merge data sets one-to-one.

/*創(chuàng)建測試數(shù)據(jù)集*/
data class1(keep = name sex) class2(keep = name age height weight);
  set sashelp.class;
  output class1;
  output class2;
run;

/*匹配連接*/
proc sort data = class1;
  by name;
run;

proc sort data = class2;
  by name;
run;

data class;
  merge class1 class2;
  by name;
run;

/*MERGE語句實現(xiàn)各種連接類型*/
/*創(chuàng)建測試數(shù)據(jù)集*/
data class1(keep = name sex) class2(keep = name age height weight);
  set sashelp.class;
  output class1;
  if _n_ in (1, 5, 10, 15) then output class2;
run;

data class2;
  set class2;
  if name = '亨利' then name = '亨瑞';
run;

/*排序準(zhǔn)備*/
proc sort data = class1;
   by name;
run;

proc sort data = class2;
   by name;
run;

data class_left;
  merge class1(in = c1) class2(in = c2);
  by name;
  if c1;
run; /*左連接*/

data class_right;
  merge class1(in = c1) class2(in = c2);
  by name;
  if c2;
run; /*右連接*/

data class_inner;
  merge class1(in = c1) class2(in = c2);
  by name;
  if c1 and c2;
run; /*內(nèi)連接*/

data class_full;
  merge class1(in = c1) class2(in = c2);
  by name;
  if c1 or c2;
run; /*全連接*/
  • 可以同時MERGE多個數(shù)據(jù)集,對于相同的變量,最后一個數(shù)據(jù)集里的值會覆蓋前一個數(shù)據(jù)的值。

Create and manipulate SAS date values.

1、Explain how SAS stores date and time values.

??在SAS中可以創(chuàng)建日期常量、時間常量、時間日期常量。這些常量的形式為在單引號或雙引號中指定日期或時間,并接著跟隨一個D(日期)、T(時間)或DT(日期時間)來說明值的類型。例如,'1jan2013'd、'9:25't、 '01may12:9:30:00'dt。任何引號中包括的前導(dǎo)或尾綴空格都不會影響這些常量的處理。

data tmp;
  date = '01Jan1960'd;
  time = '00:00:00't;
  datetime = '01Jan1960 00:00:00'dt;
run;

SAS采用數(shù)值存儲日期和時間形式的數(shù)據(jù)。在默認(rèn)情況下, SAS系統(tǒng)以0代表1960年1月1日0時。其它日期在SAS系統(tǒng)中被存儲為與該日期相差的天數(shù)。
例如, 1960年1月3日,在系統(tǒng)中存為2。
2004年1月25日,在系統(tǒng)中存為16095。

2、Use SAS informats to read common date and time expressions.

常用的SAS日期輸入格式

3、Use SAS date and time formats to specify how the values are displayed.

常用的SAS日期輸出格式
data timea;
  input dd date15.;
  format dd date9.;
  cards;
  1Jan2002
  03 Jan 2003
  15/May/2004
  12-FEB-2005
  17*May* %2006
  1**OCT**2007
  30%sep%//2008
  ;
proc print data = timea;
run;

data timeb;
  input dd mmddyy10.;
  format dd mmddyy10.;
  cards;
01312002
03122003
5 13 2004
4 21 2005
5 25 2006
1/2/2007
3-24-2008
  ;
proc print data = timeb;
run;

Control which observations and variables in a SAS data set are processed and

output.

1、Use the WHERE statement in the DATA step to select observations to be processed.

2、Subset variables to be output by using the DROP and KEEP statements.

3、Use the DROP= and KEEP= data set options to specify columns to be processed and/or output.

Manage Data

Sort observations in a SAS data set.

1、Use the SORT Procedure to re-order observations in place or output to a new dataset with the OUT= option.

PROC SORT語句格式
  • BY語句指定需要排序的變量,數(shù)據(jù)集將按此變量排序
  • descending選項:表示該選項之后的一個變量按降序?qū)τ涗浥判?;若省略引選項,則按升序?qū)τ涗浥判?/li>
  • Data=輸入數(shù)據(jù)集,即需要排序的數(shù)據(jù)集
  • Out=輸出數(shù)據(jù)集,即排序之后的數(shù)據(jù)集
data account;
  input Company $ 1-22 Debt 25-30 AccNum 33-36 Town $ 39-51;
  cards;
  Paul's Pizza 83.00 1019 Apex
  World Wide Electronics 119.95 1122 Garner
  Strickland Industries 657.22 1675 Morrisville
  Ice Cream Delight 299.98 2310 Holly Springs
  Watson Tabor Travel 37.95 3131 Apex
  Boyd & Sons Accounting 312.49 4762 Garner
  Bob's Beds 119.95 4998 Morrisville
  Tina's Pet Shop 37.95 5108 Apex
  Elway Piano and Organ 65.79 5217 Garner
  Tim's Burger Stand 119.95 6335 Holly Springs
  Peter's Auto Parts 65.79 7288 Apex
  Deluxe Hardware 467.12 8941 Garner
  Apex Catering 37.95 9923 Apex
  ;
proc sort data=account out=bytown;
  by town company;
run;

2、Remove duplicate observations with the SORT Procedure.

??使用SORT過程的NODUPKEY可以在對數(shù)據(jù)集按BY變量進(jìn)行排序的同時,刪除數(shù)據(jù)集中BY變量值相同的觀測。

filename contact 'F:\Data Analysis\SAS\Data&Code\Data\ch2\contact.csv';
proc import datafile = contact out = work.contact 
  dbms = csv replace;
  getnames = yes;
  guessingrows = max; /*注意excel沒有這個語句,其它文件都可以*/
run;

proc sort data = work.contact 
    out = fullcontact
    dupout = dup
    nodupkey;
    by name;
run;

Conditionally execute SAS statements.

1、Use IF-THEN/ELSE statements to process data conditionally.

2、Use DO and END statements to execute multiple statements conditionally.

Use assignment statements in the DATA step.

1、Create new variables and assign a value.

  • 選項RENAME=和RENAME語句


    選項RENAME=

    RENAME語句
data baseball;
    set sashelp.baseball(rename = (name = full_name));
    first_name = scan(full_name,1);
    last_name = scan(full_name,2);
run;

data baseball (rename = (name = full_name));
    set sashelp.baseball;
    first_name = scan(name,1);
    last_name = scan(name,2);
run;

data baseball;
    set sashelp.baseball;
    rename name = full_name;
    first_name = scan(name,1);
    last_name = scan(name,2);
run;

SET語句中的數(shù)據(jù)集選項RENAME=會修改變量名,此時,在編程語句中引用原變量時必須使用新的變量名;如果在輸出數(shù)據(jù)集中使用RENAME=選項或使用RENAME語句,在編程語句引用原變量時必須使用舊的變量名。

  • 賦值語句創(chuàng)建新變量

  • 對多個觀測求和:求變量總和、求BY組的總和、RETAIN語句、SUM函數(shù)


    求變量總和

    求BY組的總和
data work.shoes_subsidiary (drop = sales);
  set sashelp.shoes(keep = region subsidiary sales);
  by region subsidiary;

  if first.subsidiary then total_sales_subsidiary = 0;
  total_sales_subsidiary + sales;

  if last.subsidiary;

  format total_sales_subsidiary dollar10.;
run;
RETAIN語句

RETAIN語句求和

??如果Sales中存在缺失值,那么賦值語句中表達(dá)式(Total_Sales+Sales)的結(jié)果也為缺失值,這樣會導(dǎo)致當(dāng)前及其后所有迭代中Total_Sales的值都為缺失值。
??此外使用RETAIN語句還需要注意的是,如果該變量名僅在RETAIN語句中出現(xiàn),并且RETAIN語句中未對其賦初值,則該變量不會寫入到輸出數(shù)據(jù)集中。反之,如果RETAIN語句中給出了變量初始值,即使該變量僅在RETAIN語句中出現(xiàn),該變量也會寫入輸出數(shù)據(jù)集。
SUM函數(shù)

2、Assign a new value to an existing variable.

3、Assign the value of an expression to a variable.

4、Assign a constant date value to a variable.

Modify variable attributes using options and statements in the DATA step.

1、Change the names of variables by using the RENAME= data set option.

2、Use LABEL and FORMAT statements to modify attributes in a DATA step.

  • 當(dāng)在一個PROC過程步中使用LABEL語句時,僅在該過程步期間該標(biāo)簽與該變量相聯(lián)系
  • DATA數(shù)據(jù)步中使用時,標(biāo)簽與變量的聯(lián)系一直存在所建的數(shù)據(jù)集中

3、Define the length of a variable using the LENGTH statement.

Accumulate sub-totals and totals using DATA step statements.

1、Use the BY statement to aggregate by subgroups.

2、Use first. and last. processing to identify where groups begin and end.

3、Use the RETAIN and SUM statements.

Use SAS functions to manipulate character data, numeric data, and SAS date

values.

1、Use SAS functions such as SCAN, SUBSTR, TRIM, UPCASE, and LOWCASE to perform tasks such as the tasks shown below.

較重要的字符函數(shù)

SCAN:
【功能】從字符表達(dá)式s中搜取給定的n個單詞
【類別】 字符函數(shù)
【語法】

  1. scan(s,n) n為正數(shù)時,從字符s末尾提取n個字符
  2. scan(s,n) n為負(fù)數(shù)時,從字符s開始提取n個字符
  3. scan (s,n<,list-of-delimiters>) 空格和參數(shù)指定的分隔符同作為分隔符判斷單詞,返回分隔后的第n個單詞
    如果不指定,則按照常用的分隔符拆分,默認(rèn)分隔符為:空格 .
    注意事項:
  4. 如果缺失指定的生成變量的長度,系統(tǒng)默認(rèn)長度為200.
  5. 如果|n|=0或大于字符s的長度,則該函數(shù)返回空格。

2、Use SAS numeric functions such as SUM, MEAN, RAND, SMALLEST, LARGEST, ROUND, and INT.

SUM:求和
MEAN:均數(shù)
RAND:隨機(jī)數(shù)函數(shù)
SMALLEST(k,x1,x2,x3):從小到大排序,第k個
LARGEST(k,x1,x2,x3):從大到小排序,第k個
ROUND:四舍五入
INT:取整

data A (drop = i tmp:);
    array tmp{100};
    do i = 1 to 100;
        tmp{i} = rand('normal',5,2);
    end;
    average = mean(of tmp1 - tmp100);
    total = sum(of tmp:);
    min = smallest(1,of tmp:);
    max = largest(1,of tmp:);
    round_min = round(min);
    round_max = round(max);
    int_min = int(min);
    int_max = int(max);
run;

3、Create SAS date values by using the functions MDY, TODAY, DATE, and TIME.

TODAY:獲取當(dāng)前日期,不要參數(shù)  
DATE:獲取當(dāng)前日期,不要參數(shù)  
MDY:生成yr年m月d日的SAS日期值
WEEKDAY(date) 由SAS日期值date得到星期幾,“1”表示星期一

data B;
    today = today();
    date = date();
    mdy = mdy(4,24,2021);
    year = year(today);
    month = month(today);
    day = day(today);
    weekday = weekday(today);
run;

4、Extract the month, year, and interval from a SAS date value by using the functions YEAR, QTR, MONTH, and DAY.

YEAR(date) 由SAS日期值date得到年
QTR(date) 由SAS日期值date得到季度值
MONTH(date) 由SAS日期值date得到月
DAY(date) 由SAS日期值date得到日

data C;
    today = today();
    date = date();
    year = year(today);
        qtr = qtr(today);
    month = month(today);
    day = day(today);
run;

5、Perform calculations with date and datetime values and time intervals by using the functions INTCK, INTNX, DATDIF and YRDIF.

INTNX(interval,from,n) 計算從from開始經(jīng)過n個interval間隔后的SAS日期。其中interval 可以取'YEAR'、 'QTR'、 'MONTH'、 'WEEK'、 'DAY'等。
比如,INTNX('MONTH','16Dec1997'd, 3)結(jié)果為1998年3月1日。注意它總是返回一個周期的開始值。 

INTCK(interval,from,to) 計算從日期from到日期to中間經(jīng)過的interval間隔的個數(shù)。 其中interval取'MONTH'等。
比如, INTCK('YEAR', '31Dec1996'd, '1Jan1998'd)計算1996年12 月31日到1998年1月1日經(jīng)過的年間隔的個數(shù),結(jié)果得2,盡管這兩個日期之間實際只隔1年。

DATDIF:根據(jù)指定的日期返回兩個日期之間的天數(shù)。

Use SAS functions to convert character data to numeric and vice versa.

1、Explain the automatic conversion that SAS uses to convert values between data types.

Automatic Numeric-to-Character Conversion
數(shù)字?jǐn)?shù)據(jù)到字符數(shù)據(jù)的自動轉(zhuǎn)換非常類似于character-to-numeric conversion。只要在character context中使用數(shù)值數(shù)據(jù)值,它們就會轉(zhuǎn)換為字符值。
例如,如果您這樣做,變量Site的數(shù)值將轉(zhuǎn)換為字符值

  • 將數(shù)值賦值給先前定義的字符變量,例如字符變量SiteCode: SiteCode=site
  • 將數(shù)值與需要字符值的操作符一起使用,如串聯(lián)操作符:SiteCode=site||dept
  • 在需要字符參數(shù)的函數(shù)中指定數(shù)值,例如SUBSTR函數(shù):Region=substr(site,1,4)
    具體地說,SAS以BEST12. 格式寫入數(shù)值,得到的字符值是右對齊的。此轉(zhuǎn)換發(fā)生在對任何操作符或函數(shù)賦值或使用該值之前。自動數(shù)字到字符的轉(zhuǎn)換可能會導(dǎo)致意想不到的結(jié)果。例如,假設(shè)原始數(shù)值的數(shù)字少于12位。得到的字符值將有前導(dǎo)空格,這在執(zhí)行操作或函數(shù)時可能會導(dǎo)致問題。
    Numeric-to-character conversion還導(dǎo)致將一條消息寫入SAS日志,表明已經(jīng)進(jìn)行了轉(zhuǎn)換。

最好不要依賴自動轉(zhuǎn)換。當(dāng)您知道必須將數(shù)值數(shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù)時,可以通過在SAS程序中包含PUT函數(shù)來執(zhí)行顯式轉(zhuǎn)換。
Automatic Character-to-Numeric Conversion

2、Use the INPUT function to explicitly convert character data values to numeric values.

Input function:Explicit Character-to-Numeric Conversion
例子:您需要通過將字符變量PayRate乘以數(shù)值變量Hours來計算employee salaries。


你可以使用下面的代碼:

data hrd.newtemp;
    set hrd.temp;
    Salary=payrate*hours;
run;

您知道提交這個數(shù)據(jù)步驟將導(dǎo)致automatic character-to-numeric conversion,因為字符變量PayRate是在數(shù)字環(huán)境中使用的??梢允褂肐NPUT函數(shù)顯式地將PayRate的字符值轉(zhuǎn)換為數(shù)字值,而不是讓它自動轉(zhuǎn)換。
General form, INPUT function:
INPUT(source,informat)

  • source指出要轉(zhuǎn)換為數(shù)值的字符變量、常量或表達(dá)式
  • 還必須指定一個數(shù)字的informat,如下例所示: input(payrate,2.),因為這個source應(yīng)該是以數(shù)字的形式存在,雖然他是一個字符型變量。
    在選擇informat時,一定要選擇能夠讀取值的形式的數(shù)字informat。


例如:Test=input(saletest,comma9.);
所以開始那個例子也可以用下面的代碼實現(xiàn):
data hrd.newtemp;
    set hrd.temp;
    Salary=input(payrate,2.)*hours;
run;

請注意,當(dāng)您使用INPUT函數(shù)時,SAS日志中不會出現(xiàn)轉(zhuǎn)換消息。

3、Use the PUT function to explicitly convert numeric data values to character values.

put function: numeric-to-character conversions
PUT(source,format)
請注意,INPUT函數(shù)需要informat,而PUT函數(shù)需要format。
General form, PUT function:
PUT(source,format)

  • source*指定要轉(zhuǎn)換為字符值的數(shù)值變量、常數(shù)或表達(dá)式
  • 還必須指定與source數(shù)據(jù)類型匹配的format,如本例所示: put(site,2.)
    注意:
  • PUT函數(shù)總是返回一個字符串。
  • PUT函數(shù)返回用format.編寫的source
  • 格式必須與source的類型一致。
  • 數(shù)字格式右對齊結(jié)果;字符格式左對齊結(jié)果。表示如果是數(shù)字轉(zhuǎn)換成字符,則轉(zhuǎn)化后是右對齊,在前面補(bǔ)充空格。
  • 如果使用PUT函數(shù)創(chuàng)建一個以前沒有標(biāo)識的變量,它將創(chuàng)建一個長度等于format寬度的字符變量。
    例子:
proc import file = 'temp.csv' out = temp dbms = csv replace;run;
data newtemp;
   set temp;
   Assignment1=site||'/'||dept;
   Assignment2 = put(site, 10.);
   Assignment3=put(site,2.)||'/'||dept;
run;

結(jié)果:

  • 可見,Assignment1中,數(shù)字是右對齊的,Assignment1的總長度17=12長度的site+1長度的/+4長度的dept
  • Assignment2,長度為指定的format,即10,且是右對齊的
  • Assignment3,就是用put語句把site轉(zhuǎn)化成字符型,且其長度是2

Process data using DO LOOPS.

1、Explain how iterative DO loops function.

2、Use DO loops to eliminate redundant code and to perform repetitive calculations.

3、Use conditional DO loops.

4、Use nested DO loops.

Restructure SAS data sets with PROC TRANSPOSE.

1、Select variables to transpose with the VAR statement.

2、Rename transposed variables with the ID statement.

3、Process data within groups using the BY statement.

4、Use PROC TRANSPOSE options (OUT=, PREFIX= and NAME=).

image.png

OUT=:轉(zhuǎn)置后數(shù)據(jù)集名稱
PREFIX=:給轉(zhuǎn)置變量在新數(shù)據(jù)集中的變量名加前綴
NAME=:轉(zhuǎn)置變量在新數(shù)據(jù)集中的名字,默認(rèn)NAME

Use macro variables to simplify program maintenance.

1、Create macro variables with the %LET statement

%LET語句創(chuàng)建宏變量

2、Use macro variables within SAS programs.

引用宏變量

Error Handling

Identify and resolve programming logic errors.

1、Use the PUTLOG Statement in the Data Step to help identify logic errors.

2、Use PUTLOG to write the value of a variable, formatted values, or to write values of all

variables.

3、Use PUTLOG with Conditional logic.

4、Use temporary variables N and ERROR to debug a DATA step.

Recognize and correct syntax errors.

1、Identify the characteristics of SAS statements.

2、Define SAS syntax rules including the typical types of syntax errors such as misspelled keywords, unmatched quotation marks, missing semicolons, and invalid options.

3、Use the log to help diagnose syntax errors in a given program.

Generate Reports and Output

Generate list reports using the PRINT procedure.

Modify the default behavior of PROC PRINT by adding statements and options such as

  • use the VAR statement to select and order variables.
  • calculate totals with a SUM statement.
  • select observations with a WHERE statement.
  • use the ID statement to identify observations.
  • use the BY statement to process groups.

Generate summary reports and frequency tables using base SAS procedures.

1、Produce one-way and two-way frequency tables with the FREQ procedure.

2、Enhance frequency tables with options (NLEVELS, ORDER=).

3、Use PROC FREQ to validate data in a SAS data set.

4、Calculate summary statistics and multilevel summaries using the MEANS procedure

5、Enhance summary tables with options.

6、Identify extreme and missing values with the UNIVARIATE procedure.

Enhance reports system user-defined formats, titles, footnotes and SAS System reporting options.

1、Use PROC FORMAT to define custom formats.

  • VALUE statement
  • CNTLIN= option

2、Use the LABEL statement to define descriptive column headings.

3、Control the use of column headings with the LABEL and SPLIT=options in PROC PRINT output.

Generate reports using ODS statements.

1、Identify the Output Delivery System destinations.

2、Create HTML, PDF, RTF, and files with ODS statements.

3、Use the STYLE=option to specify a style template.

4、Create files that can be viewed in Microsoft Excel.

Export data

1、Create a simple raw data file by using the EXPORT procedure as an alternative to the DATA step.

2、Export data to Microsoft Excel using the SAS/ACCESS XLSX engine.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容