R2 | #30天專注橙長計劃#~SAS~Day 11

2.12 一行有多個觀測值的原始文件讀取

當一行出現(xiàn)多個觀測值時,可以在input語句結尾加一個停止符號@@

例子 有一個關于降水量的數據,precipitation.dat,文件包含城市名、州名、月平均降水量、月平均降水天數:

這個數據文件中,第一行包含了兩個觀測值,可以用@@的程序讀?。?br>


日志記錄如下:

中間的說明,SAS went to a new line when INPUT statement reached past the end of a line.是指讀取第二個值時達到第一行末尾,并轉到下一行繼續(xù)讀取。通常這些信息會預示一個問題出現(xiàn),但在這里它們都是你所想要的(為什么?)

輸出結果如下:

2.13 讀取原始數據的部分觀測值

有時候只需要讀取原始數據的部分觀測值,比如只需要年鑒中的女性數據、收入超過10萬的人口數據等。

此時的數據讀取方式如下:在SAS讀取某一行觀測值時,首先讀取足夠的變量以便決定是否需要保留此行的觀測值。然后在input語句結尾加符號@,叫做a trailing at(called a trailing at),這告訴SAS先停在(hold)此行,同時用IF語句檢測此觀測值是否滿足需要,如果是,那么可以再用一個input語句來讀取現(xiàn)有的變量。

例子 有一個關于當地交通的數據,traffic.dat數據包含街道的類型(freeways和surface)、街道類型、早晨每小時的機動車流動量、晚上每小時機動車流動量。

如果現(xiàn)在你只需要freeway的數據,可以用下述程序:

第一個input讀取字符串變量,@是SAS停留在觀測值上并用IF檢測,第二個input讀取input后面的變量值。

程序執(zhí)行后日志包括兩部分說明,一個說明讀取了8個記錄,另一個說明新數據集中只包含三個觀測值。

輸入結果如下所示:

@ vs @@ @的作用類似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使SAS停留到下一個input語句(也不換行),@@能使停留的時間到下一個data步(也不換行)。 比如這段代碼:

data test;?

infile cards ;?

input x @; input y;

?input z @@;

?cards;?

1 2 3 4 5 6?

7 8 9 10 11 12

?13 14 15 16 17?

;?

run;

test輸出結果就是:

2.14 用infile語句中的選項控制輸入

讀取原始數據時,SAS做了某些假設,比如從第一行開始讀取數據,對于跨行觀測值,會自動轉到下一行繼續(xù)讀取。但有的特殊數據不滿足這些假設,infile語句中的選項可以讓SAS讀取這些特殊數據。

FIRSTOBS= FIRSTOBS= 選項告訴SAS從哪一行開始讀取數據,當數據開頭有些說明信息,或者想要跳過某些行時,這個選項很有用。例如,如下原始數據文件中,開頭兩行是關于數據的描述:

那么用如下程序可以讓SAS從第三行開始讀取數據:

OBS= OBS=告訴SAS一直讀取到哪一行位置,注意是行而不是觀測值(有的觀測值占據多行)比如,如下的原始數據文件中,結尾處還有一句不需要的數據說明時。就需要這個選項:

用FIRSTOBS=3和OBS=5就可以讀取第三行到第五行的數據:

MISSOVER 在input語句中輸入的幾個變量,SAS在觀測值中就讀取幾個變量,如果一行未讀完,則進入下一行直到輸入的變量都讀取了變量值。missover可以讓SAS不進入下一行讀取,未賦值的變量就使其成為缺失值。當如下這種數據,就需要missover選項,一個學生應該有5門課的成績,但由于最后兩門是自學課程,不是所有學生都完成,故而缺失:

如下的程序可以讓SAS將Nguyen第五門課的成績設為缺失值,從而不牽扯到下一行:

Truncover 使用column input或formatted input輸入時可能會需要這個選項,因為這時有的數據行比其他的短。如下的原始數據中,由于三行的長度都不一樣,input中只能指定最長的一行:

程序如下:

這里指定了第二行的長度street $ 22-37,但是第一行maple ave.并沒占夠至第37列(注意后面是沒有空格的),故而必須用truncover,否則會轉到下一行繼續(xù)讀取,第三行情況也是。

2.15 用數據步讀取分隔符文件(delimited files)

分隔符文件中,變量值之間會用一些特殊的字符隔開,比如逗號或制表符。DLM=和DSD選項可以讓SAS容易的讀取這些分隔符文件。

DLM= 用list input讀取文件時,變量值之間應該用空格隔開。對于其他的分隔符,可以用DLM=,DELIMITER=選項來指定,從而可以讀取文件。

例子 如下的數據中,學生姓名、每周讀的書的數目是用逗號隔開的:

用選項來指定分隔符即可:

如果原始數據是用制表符隔開的,那么可以使用DLM=’09’X來指定,因為制表符的十六進制值是09,如果你電腦使用EBCDIC(擴充的二進制編碼的十進制交換碼),那么應該用DLM=’05’X。

DSD DSD (Delimiter-Sensitive Data)有三個作用:忽略引號中數值的分隔符;自動將字符數據中的引號去掉;將兩個相鄰的分隔符當做缺失值來處理。并且,DSD默認分隔符為逗號,如果數據中的分隔符不是逗號,那么要用delimiter來指定。比如,讀取一個制表符為分隔符、并且用兩個制表符代表缺失值的數據文件,則要用下面的語句:

INFILE ’file-specification’ DLM=’09’X DSD;

CSV文件 CSV文件,Comma-separated values files,是可以用DSD選項的文件類型。Excel可以儲存CSV格式的文件。

例子 某咖啡館,老板每晚請不同的樂隊表演來吸引顧客,他記錄了樂隊名稱、演出日期、晚上8點、9點、10點、11點的顧客數量:

注意,其中有一個樂隊的名字中用逗號來分隔,并且使用了引號。最后一條記錄中還有一個缺失值,用兩個連續(xù)的逗號表示。INFILE語句中的DSD選項可以用來讀取這個文件,并且,由于每個記錄長度不一樣,還需要用missover:

注意bandname和GigDate兩個變量使用了冒號修改器,冒號修改器告訴SAS讀取信息的長度(BandName為30,GigDate為10)。輸出結果如下:

2.16 用導入過程(IMPORT procedure)讀取分隔符文件。

Proc import會瀏覽你的數據文件,自動決定變量類型(字符串或數值),為字符串變量分配正確的長度,辨認出日期變量。Proc import會將兩個連續(xù)的分隔符視為缺失值,會讀取引號中的變量值。一行讀完后,會自動分配缺失值給未賦值的變量。Also,if you want,you can use the first line in your data file for the variable names。導入過程(IMPORT procedure)自動問你寫下數據步,這可以在提交之后的日志窗口中查看。

一個導入過程(IMPORT procedure)的最簡單形式:

PROC IMPORT DATAFILE=’filename’ OUT=data-set;

用語句DATAFILE=’filename’讀取文件名,用OUT=data-set創(chuàng)建SAS數據集。SAS會通過文件的擴展名來檢測文件的類型:?

如果文件沒有正確的擴展名,或者是DLM格式的,必須在proc import語句中用DBMS=option。如果想要創(chuàng)建的數據集名字已經存在,那么要用replace選項代替。一個使用replace和dbms的例子。

PROC IMPORT DATAFILE=’filename’ OUT=data-set DBMS=identifier REPLACE;

導入過程(IMPORT procedure)從數據文件中的第一行獲取變量名,可以通過在PROC IMPORT后面增加GETNAMES=NO語句來改變這種默認,PROC IMPORT會分配給變量名字:VAR1,VAR2,VAR3等。如果你的數據文件是DLM類型的,PROC IMPORT會假定分隔符為空格,用DELIMITER=可以改變默認的分隔符。如下是一段有上述代碼的程序:

例子 下面還是使用咖啡館中,樂隊表演的例子(2.15),注意其中有一個樂隊的名字中用逗號來分隔,并且使用了引號:

用proc import讀取數據的代碼如下:

輸出結果如下,注意GigDate的日期格式能夠被proc import辨認出來:

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容