




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、轉(zhuǎn)載:SAS函數(shù)精選一 翻譯下面是Dr. Ron Cody的一篇關(guān)于SAS函數(shù)的文章,非常好的函數(shù)介紹文章。曾經(jīng)在2009年SAS公司(上海)舉辦的一次SASor聚會上,我做了一次關(guān)于SAS函數(shù)的presentation分享,見 ppt和正文,我發(fā)現(xiàn)竟然有部分內(nèi)容重合。 我個人非常喜歡SAS系統(tǒng)提供的函數(shù),建議老手新手都可以讀讀下面的文章,祝都有所獲!最有用的一些SAS函數(shù)A Survey of Some of the Most Useful SAS Functionsby Dr. Ron Cody 翻譯 sxlion摘要:SAS函數(shù)為你的數(shù)據(jù)步(DATA step)編程提供驚人的能力。有一部
2、分SAS函數(shù)是精華,能夠幫助你節(jié)省大量不必要的代碼。這篇文章內(nèi)容覆蓋其中最有用的一些SAS函數(shù)。有些函數(shù)可能對你來說有些陌生,然后她們將會改變你的編程方式,并助你輕松完成日常的編程任務(wù)。介紹:本文寫到的大部分函數(shù)都與字符數(shù)據(jù)有關(guān),這些函數(shù)的功能包括搜索字符串,查找和替代字符串,或連接字符串,還有些函數(shù)能測量兩個字符串之間的距離(這對于“模糊”配對非常有用)。一些最新和最嘆為觀止的函數(shù)還以Call例程的形式存在。你知道怎么用函數(shù)在同一個觀察值進行排序嗎?你知道你不僅可以定位一列變量中極大或極小值,而且可以定位到第二位、第三位最大或最小的值? 如果你覺得上面的介紹能夠吸引你的興趣,請繼續(xù)往下讀!
3、SAS是怎樣存儲字符值的?在我們討論字符函數(shù)之前,了解SAS怎樣存儲函數(shù)值非常重要。為了幫助討論,你首先需要理解兩個重要的字符函數(shù):LENGTHN和 LENGTHC。LENGTHN和 LENGTHC這兩個函數(shù)返回字符值的長度信息,其中LENGTHN返回未計算后綴空格語句的長度。LENGTHC返回字符變量的存儲長度。你也許對舊的SAS函數(shù)LENGTH比較熟悉,大部分情況下函數(shù)LENGTH和LENGTHC返回同樣的值。有一個例外的是,當語句里是缺失值時,LENGTH函數(shù)返回的是1,而LENGTHN返回0。有一些新函數(shù)看起來是在舊函數(shù)后面加個字母“n”,這里的“n”代表“空字符串”(“null st
4、ring”)。在SAS9中,長度為0的字符串概念被引進。在大多數(shù)情況下,如果你看到一個你似曾相識的新函數(shù)(比如說新函數(shù)TRIMN,你已經(jīng)知道函數(shù)TRIM),你應(yīng)該使用帶“n”的新函數(shù)。 看一下下面的程序:程序112345678910data chars1;length String $ 7;String = 'abc'Storage_length = Lengthc(string);Length = lengthn(String);Display = ":" | String | ":"put Storage_length= /Lengt
5、h= /Display=;run;圖1:程序1的結(jié)果Storage_length=7Length=3Display=:abc :記住,SAS字符變量的存儲長度在編譯階段被設(shè)置。因為LENGTH語句在字符設(shè)置語句之前,SAS為字符串設(shè)置了長度為7。因為字符串長度為3,LENGTHN函數(shù)沒有計算字符后面的空格,于是返回3。最后,在字符串的兩邊各加一個冒號,這樣就清楚的看到字符串后面包含了四個空格。如果你把LENGTH語句往后面移一步,像下面:程序212345678910data chars2;String = 'abc'length String $ 7;Storage_lengt
6、h = lengthc(String);Length = lengthn(String);Display = ":" | String | ":"put Storage_length= /Length= /Display=;run;你將得到下面結(jié)果:圖2:程序2的結(jié)果Storage_length=3Length=3Display=:abc:注意到上面結(jié)果中,LENGTH語句被忽略了。因為Sting = “abc”出現(xiàn)在LENGTH語句之前,字符串的長度已經(jīng)被設(shè)置。根據(jù)經(jīng)驗,運行PROC CONTENTS來查看所有數(shù)據(jù)集,檢查所有字符變量的存儲長度。如果你
7、看到有些字符串的長度達到200,你不用吃驚,因為很多SAS字符函數(shù)的默認長度就是200,也就是說如果你沒有顯示的用LENGTH語句或其他方式定義變量長度的話,SAS就會默認字符串長度為200。缺失值函數(shù)和CALL MISS例程在過去,你可以像下面這樣檢查一個數(shù)據(jù)步中的缺失值:*老方法 ;if Age = . then . . .If Char = then . . .*新方法 ;if missing(Age) then . . .if missing(Char) then . . .這個missing函數(shù)的新語句可以確認數(shù)值變量和字符變量是否為空 ,如果是空,則返回1,否則返回0。我個人非常推
8、薦你在任何需要測試一個變量是否為空的程序中使用這個函數(shù)。這樣你會發(fā)現(xiàn)你的程序更漂亮。如果你需要設(shè)置一個或多個字符或數(shù)字變量為空值,你可以使用下面的老方法,比如:123456789array x10 x1-x10;array chars5 a b c;do i = 1 to 10;xi = .;end;do I = 1 to 3;charsi = ' 'end;drop i;或者你也可以使用像下面這樣的call missing歷程,以便節(jié)約更多的時間。call missing(of x1-x10, a b c);INPUT函數(shù)這是我學習SAS(多年前)是遇到理解困難的函數(shù)之一。一
9、個簡單的方法就是思考INPUT函數(shù),問自己“INPUT語句是干什么的?”,它通常從按照預(yù)先提供的INFORMAT格式從一個文件中讀取文本。同樣,INPUT函數(shù)做類似的工作,它根據(jù)函數(shù)提供的第二個語句INFORMAT,讀取函數(shù)提供的第一個語句中的文本。也許下面的程序可以跟直觀的幫助理解。程序31234567data _null_;c_date = "9/15/2004"c_num = "123"Sas_Date = input(c_date,mmddyy10.);Number = input(c_num,10.);put SAS_Date= Number=
10、;run;程序3中有兩個字符變量c_date和c_num。使用INPUT函數(shù),你可以根據(jù)第一個語句的值新建一個真實的SAS數(shù)據(jù)(數(shù)值型),根據(jù)第二個語句將字符轉(zhuǎn)化為數(shù)值。注意,c_num的讀入格式是10.。和從文件中讀入文本不同的是,INFORMAT不能讀完字符值。運行這段代碼,SAS_Date和Number的值顯示如下: 圖3:程序3的結(jié)果Sas_Date=16329 Number=123PUT函數(shù)PUT函數(shù)是與INPUT函數(shù)對應(yīng)的函數(shù)。同樣,你可以考慮PUT語句的作用讀取一個SAS值(字符或數(shù)值型),應(yīng)用輸出格式FORMAT,并通常寫出到一個文件的結(jié)果中。PUT函數(shù)獲取第一個語句的SAS值
11、,并且按照第二個語句的格式寫出到結(jié)果中。PUT函數(shù)的用途之一就是將數(shù)值型轉(zhuǎn)化為字符型,另外一個用途就是使用用戶自定義格式建立一個新變量。下面是一個例子:程序4123456789data _null_;SAS_Date = 1;Number = 1234;SS_num = 123456789;Char_Date = put(SAS_Date,mmddyy10.);Money = put(Number,dollar8.2);SS_char = put(SS_num,ssn.);put Char_date= Money= SS_char=;run;這個例子使用了三個數(shù)值(分別是SAS日期,一個數(shù)和一
12、個社會安全號),并且新建了三個字符型變量。運行這段代碼后,字符變量的值為:圖4,程序4的結(jié)果Char_Date=01/02/1960Money=$1234.00SS_char=123-45-6789下一段程序告訴你使用一個格式將不同年齡組進行分類,這種方式在某種程度上比使用一系列的IF-THEN-ELSE語句更簡單。下面是程序例子:程序512345678910111213proc format;value agegrp 0-20='0 to 20'21-40='21 to 40'41-high='41+'run;data PutEx;input
13、Age ;AgeGroup = put(Age,agegrp.);datalines;15 25 60;proc print;run;新變量AgeGroup是一個使用了格式化的Age值的字符變量。新變量的存儲長度是與格式化值最大長度是一致的。下面,你可以看看變量Age和AgeGroup的值。圖5:程序5的結(jié)果Age AgeGroup15 0 to 2025 21 to 4060 41+FIND和FINDC函數(shù)FIND函數(shù)使用第一個語句定義的字符串,查找有第二個語句定義的子字符串,如果子字符串找到,函數(shù)返回它的位置。如果沒有找到,則返回0。FIND函數(shù)中有兩個可選的語句修飾符和起始位置。最常用的
14、修飾符為“i”,表明忽略大小寫。起始位置定義在開始搜索的位置,如果起始值為負數(shù),則搜索開始于起始位置絕對值的位置,并且從右往左搜索。隨便提一下,兩個可選語句的位置可以顛倒。為什么這樣也可以呢? 修飾符通常是字符值,而起始位置通常是數(shù)字值,哈哈,厲害吧!如果你僅僅輸入了一個修飾符或起始位置值,放第三個語句位置即可。下面是一個例子。程序1234567891011data locate;input String $10.;First = find(String,'xyz','i');First_c = findc(String,'xyz','i
15、');/* i means ignore case */datalines;abczyx1xyz1234567890abcz1y2x39XYZabcxyz;這個例子中的兩個函數(shù)使用修飾符“i”,使用了此修飾符,你可以省去改變一個或多個字符串大小寫形式的麻煩。圖:程序的結(jié)果String First First_cabczyx1xyz 8 41234567890 0 0abcz1y2x39 0 4XYZabcxyz 1 1第一個觀察值,子字符串xyz在String的第八個位置才找到。因為FINDC函數(shù)在尋找字母“x”或“y”或“z”,在第一個觀察值中返回一個4,因為字母z在第四個位置找到了
16、。注意但在觀察值2中沒有找到任何配對成功時,函數(shù)返回0。COMPRESS函數(shù)這個當然是我最喜歡的SAS函數(shù)之一。據(jù)我所知,這是唯一從版本8升級到版本9的函數(shù)。這怎么可能呢?該函數(shù)寫法在SAS8和SAS9中是一模一樣的么?答案是“yes“,除了在版本9中增加了一個可選的第三項外。在COMPRESS函數(shù)中的三個語句是:Compress(String, characters-to-remove, optional-modifiers)其中,Sting是你想要壓縮的字符串(除非你使用k修飾符)characters-to-remove是你一列你想要從String中去掉的字符串。如果你僅僅給出了COMPR
17、ESS函數(shù)一個語句,那么就將除掉String中所有的空格??蛇x修飾符允許你指定字符串子語句,例如:· a 大寫 或小寫字母 · d 數(shù)值(dignits) · i 忽略大小寫 · k 保留列表字符串,而不是去掉 · s 空間(blank,tabs,if,cr) · p 標點符號 我相信修飾符k讓這個函數(shù)變得真正強大。k選項告訴函數(shù)所需要保留的字符列表。設(shè)定你需要保留的通常要優(yōu)于你想去掉的。比如說,如果你使用兩個修飾符k和d,函數(shù)將會保留字符串中所有數(shù)字,丟掉其他東西。這個在你的字符串中包含不可打印的字符串非常有用。下面是一個例子:程序
18、7123456789data phone;input Phone $15.;Phone1 = compress(Phone);Phone2 = compress(Phone,'(-) ');Phone3 = compress(Phone,'kd');datalines;(908)235-4490(201) 555-77 99;COMPRESS函數(shù)將除掉Phone1中的所有空格,因為你僅僅使用了一個語句。對于Phone2,你指定了左右括號,破折號和空格。對于Phone3,你指定了兩個修飾符k和d。注意兩個冒號,這個非常有必要,可以告訴SASkd是修飾符(第三個語句
19、),而不是需要除掉的字符(第二個語句)。注意下面結(jié)果中,Phone2和Phone3是同樣的結(jié)果,然而在Phone中有多余的符號字符。圖7:程序7的結(jié)果Phone Phone1 Phone2 Phone3(908)235-4490 (908)235-4490 9082354490 9082354490(201) 555-77 99 (201)555-7799 2015557799 2015557799這里有另外一個非常有用的例子,將演示COMPRESS函數(shù)能夠用于從包括像包含單位的非數(shù)字字符串中提取數(shù)值??聪旅妫撼绦?12345678910data Units;input 1 Wt $10.;W
20、t_Lbs =input(compress(Wt,'kd'),8.);if findc(Wt,'K','i') thenWt_Lbs = 2.2*Wt_Lbs;datalines;155lbs90Kgs.;你看輸入數(shù)據(jù)中包括像lbs.或kgs.的單位。這是非常的問題。使用COMPRESS函數(shù)可以得到一個非常簡單和漂亮的方法。你開始可以僅保留原始值中的數(shù)值,然后使用INPUT函數(shù)把字符轉(zhuǎn)化成數(shù)值?,F(xiàn)在你需要判定,是否原始值中包括一個大寫或小寫的k。如果是,你需要把公斤單位轉(zhuǎn)化成英鎊。帶修飾符i的FINDC函數(shù)可以輕而易舉的完成這個判斷。圖8:程序8
21、的結(jié)果Wt Wt_Lbs155lbs 15590Kgs. 198SUBSTR函數(shù)如果你需要從一個字符串中提取一個子字符串,你需要SUBSTR函數(shù)。需要提醒一下的是,有個函數(shù)SUBSTRN非常像SUBSTR,就是多了一些額外的特征。我不知道這些特征是否經(jīng)常被需要,因此本文選擇描述稍微簡單的函數(shù)SUBSTR。此函數(shù)的第一個語句是輸入字符串,第二個語句是你想要提取字符串的開始位置,第三個是,可選語句,設(shè)定子字符串的長度。如果你忽略第三個語句,函數(shù)將提取輸入字符串中最后一個非空字母,也就是說,它忽略輸入字符串的后面的空格(這個特征非常有用)。在我們繼續(xù)例子之前,理解默認長度這個概念非常重要。比如說,在
22、下一個程序中,如果你沒有寫LENGTH語句,SAS將仍然需要設(shè)置一個長度給State。對于這個函數(shù),默認長度等于函數(shù)第一個語句的長度。你不能使得從字符串提取的子字符串長于字符串本身。很多其他的SAS字符函數(shù)默認長度為200。需要保證的是,具有這個功能的函數(shù)需要在DATA步中包含LENGTH語句。最好是包含LENGTH語句,即使是不需要,這樣是沒有風險的。下面是一個使用SUBSTR函數(shù)的簡單例子。程序9123456789data pieces_parts;input Id $9.;length State $ 2;State = substr(Id,3,2);Num = input(substr
23、(Id,5),4.);datalines;XYNY123XYNJ1234;這里是你想要提取州號碼(從位置3開始,一共兩位),ID的數(shù)字部分從位置5開始。注意你忽略數(shù)值提取中的第三個語句。這個非常有用,因為有的數(shù)字是3個字符長,有的是4個字符長。這個例子中,你使用INPUT函數(shù)將字符轉(zhuǎn)化為數(shù)值。圖9,程序9的輸出結(jié)果Id State NumXYNY123 NY 123XYNJ1234 NJ 1234使用等號在左邊的SUBSTR函數(shù)在早期學SAS的時候,等號在左邊的SUBSTR函數(shù)被稱為是SUBSTR假函數(shù)。據(jù)我所知,這是SAS唯一等號在左邊的函數(shù)。下面是它的用途:允許你用新的字符來替代已有字符串
24、中的字符。這個聽起來挺復(fù)雜的,但是你通過下面的程序看到,這實際上是很直接的方式。下面的程序使用SUBSTR函數(shù)(等號在左邊的)來遮住帳號的前五個字符。代碼如下:程序101234567data bank;input Id Account : $9. ;Account2 = Account;substr(Account2,1,5) = '*'datalines;001 123456789 002 049384756 003 119384757;首先,你把Account的值賦給另一個變量(Account2),這樣你不會改變原來變量的值。然后,你替換Account2中的字符,從位置1開
25、始的用5個長度的5個星號。下面是結(jié)果:圖10:程序10的結(jié)果Id Account Account21 123456789 *67892 049384756 *47563 119384757 *4757SCAN函數(shù)你可以使用SCAN函數(shù)來解析一個字符串。SCAN函數(shù)的第一個語句是你需要解析的字符串。第二個語句指定你需要提取的單詞“word”。第三個語句(可選)是分隔符列表。我把“word”用引號引起來原因是SAS定義一個單詞都會用一個分隔符分開。默認的分隔符號是特別長,并且與ASCII和EBCDIC編碼稍稍有些不同。因此,這樣便于更好的提供一個第三個語句和顯示的指定你的分隔符。這個函數(shù)一個非常有
26、用的特征是,你能夠使用負數(shù)值。這將導致掃描從右向左進行,這個對于類似First, Middle,Last或First, Last形式的姓名解析非常有用。 如果你使用語句值為-1時,你將會得到last name那么。下面是舉例:程序111234567891011data first_last;length Last_Name $ 15;input 1 Name $20.;Last_Name = scan(Name,-1,' ');datalines;Jeff W. SnokerRaymond AlbertAlfred E. NewmanSteven J. FosterJose R
27、omerez;有些名字包含一個中間名,有的則沒有。在這個函數(shù)的第二個語句中使用-1,你就可以總是得到last name。圖11:程序11的結(jié)果Last_Name NameSnoker Jeff W. SnokerAlbert Raymond AlbertNewman Alfred E. NewmanFoster Steven J. FosterRomerez Jose RomerezUPCASE,LOWCASE和PROPCASE 函數(shù)這三個函數(shù)主要是用于改變語句的大小寫狀態(tài)。UPCASE和LOWCASE的功能是顯而易見的。PROPCASE(意思是合適的大小寫狀態(tài))將每一個“word”第一個字母
28、大寫,而將其余的字母小寫。同樣,你看到這里的“word”也放在引號里。這個默認的分隔符是空格,因此PROPCASE函數(shù)將會把每個單詞首字母改成大寫。你可以指定一系列分隔符作為該函數(shù)第二個可選語句。我推薦同時指定空格和單引號作為分隔符。然后這個函數(shù)就會正確的大寫首字母,比如說DAngelo。下面是例子:程序12123456789data case;input Name $15.;Upper = upcase(Name);Lower = lowcase(Name);Proper = propcase(Name," '");datalines;gEOrge SMITHD&
29、#39;Angelo;注意你需要將你指定的分隔符列表放在雙引號中。圖12:程序12的結(jié)果Name Upper Lower PropergEOrge SMITH GEORGE SMITH george smith George SmithDAngelo DANGELO dangelo DAngeloTRANWRD函數(shù)這個函數(shù)對給定字符串執(zhí)行查找和替代的操作。這個函數(shù)有三個語句分別是輸入字符串,需要查找的字符串和替代字符串。如果替代字符串比需要查找的字符串還要長,你可能需要使用LENGTH語句來新建一個變量,以防你的值被默認截斷。TRANWRD使用的通常情況是地址標準化,如下面的程序所示。程序13
30、123456789101112data convert;input 1 address $20. ;* Convert Street, Avenue andBoulevard to their abbreviations;Address = tranwrd(Address,'Street','St.');Address = tranwrd(Address,'Avenue','Ave.');Address = tranwrd(Address,'Road','Rd.');datalines;89 Laz
31、y Brook Road123 River Rd.12 Main Street;使用三個TRANWRD函數(shù),你可以用Street,Avenue和Road縮寫來替代它們。圖13:程序13的結(jié)果Obs address1 89 Lazy Brook Rd.2 123 River Rd.3 12 Main St.SPEDIS函數(shù)函數(shù)SPEDIS是模糊配對最有用的函數(shù)之一。這個函數(shù)計算兩個字符串之間的拼寫距離“spelling distance”。你曾經(jīng)在微軟辦公軟件Word中拼寫錯過單詞嗎?Ok,別人告訴我如果你拼寫錯了,Word將會在拼錯單詞下面劃紅線。你可以通過右擊鼠標,然后下拉菜單中將出現(xiàn)可能正
32、確的單詞。函數(shù)SPEDIS使用了類似的算法,如果兩個字符串(分別是語句1和語句2)配對非常準確,那么函數(shù)返回0。對于每一組拼寫錯誤,函數(shù)給出一個罰分。例如,如果你的第一個字母錯誤,你就會得到一個大的罰分。如果你將兩字母位置搞錯(比如位置對換),你將會得到一個相對小的罰分。當函數(shù)合適每類錯誤,它除以根據(jù)第一個字符串的長度的總罰分。這樣就有意義了。假設(shè)你在一個三個字母的單詞和10字母單詞中拼寫一個錯誤相比,那么前面則是錯誤更大,拼寫距離也就越大。對于拼寫距離來說,什么樣的值認為大呢?例如,如果你在對兩個文件中進行姓名配對時允許非常大的拼寫距離值,你可能將不屬于一塊的觀察值聯(lián)系起來。如果你允許姓名之
33、間非常小的拼寫距離,你可能不會將同樣的姓名放一起。為了感受不同拼寫錯誤導致的結(jié)果值,看看下面的程序: 程序141234567891011data compare;length String1 String2 $ 15;input String1 String2;Points = spedis(String1,String2);datalines;same samesame samfirst xirstlast lasxreceipt reciept;圖14:程序14的結(jié)果String1 String2 Pointssame same 0same sam 8first xirst 40last
34、lasx 25receipt reciept 7你可能考慮使用SOUNDEX來配對兩個文件中的姓名,然而,我發(fā)現(xiàn)SOUNDEX更傾向于差異特別大的姓名配對。TRIMN和STRIP函數(shù)函數(shù)TRIMN用來去掉后綴空格,函數(shù)STRIP用于去掉前面和后綴的空格。TRIMN和老的函數(shù)TRIM類似,除了在處理缺失值問題上。當你有一個缺失值時,TRIM函數(shù)返回一個單獨的空格,而TRIMN則返回一個長度為0的字符串。當你使用連接符號連接字符串時,這兩個函數(shù)都是有用的。下面程序會演示:程序151234567891011data _null_;length Concat $ 8;One = ' ABC &
35、#39;Two = 'XYZ'One_two = ':' | One | Two | ':'Trim = ':' | trimn(One) | Two | ':'Strip = ':' | strip(One) | strip(Two) | ':'Concat = cats(':',One,Two,':');put one_two= / Trim= / Strip= /Concat=;run;圖15:程序15輸出結(jié)果One_two=: ABC XYZ:
36、Trim=: ABCXYZ:Strip=:ABCXYZ:Concat=:ABCXYZ:當你不使用任何一個函數(shù)連接兩個字符串時,你能看到結(jié)果都保留空格。注意,變量Trim值中的ABC和XYZ之間沒有空格,而Strip變量則沒有任何空格。最后你會發(fā)現(xiàn)使用CATS函數(shù)可以更輕松的去掉前面和后綴的空格,然后連接字符串。NOTALPHA,NOTDIGIT和 NOTALNUM函數(shù)我僅僅列出了三個“not”函數(shù),如果你查SAS在線文檔或文后列的參考文章,你會發(fā)現(xiàn)這樣的函數(shù)還有更多。當遇到字符串中的不是alpha(字母),digit(數(shù)字),或alphameric(字母或數(shù)字)時,每個函數(shù)返回第一個遇到位置。
37、由于所有的“not”函數(shù)會搜索字符串的每一個位置,包括后面的空格,因此你首先需要使用strip或trim去掉它們。這類函數(shù)的第二個語句是可選的,用于設(shè)置你要開始搜索的起始位置。如果你輸入一個負值,那么搜索將從這個值的絕對位置處,從右往左執(zhí)行。如果函數(shù)沒有找到對應(yīng)的字符,就返回0。這類函數(shù)對于字符型數(shù)據(jù)清理來說是強大無比的。你可以對一個字符值定義一個規(guī)則, 讓其僅僅包含數(shù)字或者字符等等。下面是一個例子:程序161234567891011data data_cleaning;input String $20.;Not_alpha = notalpha(strip(String);Not_digit
38、 = notdigit(strip(String);Not_alnum = notalnum(strip(String);datalines;abcdefg1234567abc1231234abcd;圖16:程序16的輸出結(jié)果Not_ Not_ Not_String alpha digit alnumabcdefg 0 1 01234567 1 0 0abc123 4 1 01234abcd 1 5 0 CATS和CATX函數(shù)這兩個函數(shù)用于連接字符串。函數(shù)CATS首先去掉每個要連接字符串的首尾空格。CATX也會去掉首尾的空格,并且還會在每個字符串之間插入分隔符(CATX函數(shù)的第一個語句)。這些
39、函數(shù)需要非常注意的點是結(jié)果的存儲長度,如果沒有預(yù)先定義,默認是長度200。而你使用連接符號(|或?。┲皇沁@些連接字符串長度之和。如果你有一系列的變量如Base1-Basen,你可以在列表前使用關(guān)鍵詞OF。最后,列表中的值可以是字母,也可以說數(shù)字。如果一些語句是數(shù)字,SAS將會把數(shù)字當作字母對待,并且不會在SAS log里面出現(xiàn)轉(zhuǎn)換信息。下面的例子示意這些函數(shù)字母操作去掉空格,函數(shù)CATX字母插入分隔符。程序1712345678data join_up;length Cats $ 6 Catx $ 13;String1 = 'ABC 'String2 = ' XYZ
40、39;String3 = '12345'Cats = cats(String1,string2);Catx = catx('-',of String1-String3);run;圖17:程序17的輸出結(jié)果Cats CatxABCXYZ ABC-XYZ-12345COUNT和COUNTC函數(shù)SAS有兩個計數(shù)函數(shù),COUNT和COUNTC。它們之間的區(qū)別就像FIND和FINDC。COUNT計算一個子字符串在一個字符串中出現(xiàn)的次數(shù),COUNTC計算單獨字母在字符串中出現(xiàn)的次數(shù)。這些函數(shù)的語句和FIND和FINDC一樣。第一個語句是你想要搜索的字符串,第二個語句是子字符
41、串(COUNT)或一列字母(COUNTC)。最后你可以在第三個語句中使用可選的修飾符,其中修飾符i(忽略大小寫)最有用了。下面的程序演示這兩個函數(shù)。程ata Dracula; /* Get it Count Dracula */input String $20.;Count_abc = count(String,'abc');Countc_abc = countc(String,'abc');count_abc_i = count(String,'abc','i');datalines;xxabcxABC
42、xxbbbbcbacba;圖18:程序18輸出結(jié)果Count_ Countc_ count_String abc abc abc_ixxabcxABCxxbbbb 1 7 2cbacba 0 6 0有意思的組合:COUNTC和CATS函數(shù)COUNTC和CATS函數(shù)組合非常有意思和強大。假如你有一個調(diào)查,你對每一個結(jié)果記錄Y或N。假如你想要對Y進行計數(shù)(不論大小寫)。你可能立即想到把每個調(diào)查變量放到一個數(shù)組中,然后循環(huán)每個問題,逐個對Y進行加一計數(shù)。試試獨創(chuàng)的COUNTC和CATS函數(shù)組合方法來實現(xiàn)這個目標。第一次見到組合函數(shù)是我的朋友Mike Zdeb發(fā)來的郵件。我相信是他首創(chuàng)的這個方法。下面
43、是代碼。程序191234567data Survey;input (Q1-Q5)($1.);Num = countc(cats(of Q1-Q5),'y','i');datalines;yynnYnnnnn;CATS函數(shù)連接所有的調(diào)查結(jié)果到一個字符串中,然后使用COUNTC函數(shù)對這個字符串中的Y進行計數(shù)。我太喜歡這個程序了。圖19:程序19的結(jié)果Q1 Q2 Q3 Q4 Q5 Numy y n n Y 3n n n n n 0一些日期函數(shù) MDY, MONTH, WEEKDAY, DAY, YEAR和YRDIF這一節(jié)涉及到最常用(有用)的日期函數(shù)。函數(shù)MDY根據(jù)給
44、定的月份、天和年份返回一個SAS日期。函數(shù)WEEKDAY,DAY,MONTH和YEAR的語句中使用SAS日期,分別返回一周中的一天(比如1等于星期日,2等于星期一,依此類推),一個月的天數(shù)(從1到31的數(shù)字),月份(從1到12的數(shù)字)和年份。函數(shù)YRDIF計算兩個日期相隔的年數(shù)。前面兩個語句為第一個日期和第二個日期。第三個可選的語句允許你指定一個月中的天數(shù),一年中的天數(shù)。例如,對于特定的金融計算(比如債券利息),你可能指定30/360達到每月30天,每年360天。函數(shù)YRDIF 在計算閏年的時候有點不同,這個問題在SAS9.3中已經(jīng)解決。如果你使用的是9.3以前的版本,你需要指定ACT/ACT
45、作為YRDIF函數(shù)的第三語句。注意,當涉及閏年是,計算結(jié)果有一天的偏移。盡管如此,筆者認為這個仍然比把兩個日期之差除以365.25。下面的程序演示所有的日期函數(shù):程序201234567891011data DateExamples;input (Date1 Date2)(:mmddyy10.) M D Y;SAS_Date = MDY(M,D,Y);WeekDay = weekday(Date1);MonthDay = day(Date1);Year = year(Date1);Age = yrdif(Date1,Date2);format Date: mmddyy10.;datalines;
46、10/21/1955 10/21/2012 6 15 2011;圖20:程序20的結(jié)果Week MonthSAS_Date Day Day Year Age18793 6 21 1955 57ARRAY數(shù)組函數(shù)你定義一個數(shù)組,發(fā)現(xiàn)對數(shù)組中的元素進行計數(shù)是件不方便的事。在一個數(shù)據(jù)集中,你定義了一個全部是數(shù)值或字符變量的數(shù)組。如果數(shù)據(jù)包含大量的變量,你可能不會數(shù)它們。函數(shù)DIM將數(shù)組名作為語句,返回該數(shù)組的元素個數(shù)。特別是當你定義數(shù)組,你使用星號來代替數(shù)組元素個數(shù)。在下面的程序中,使用關(guān)鍵詞_numeric_和 _character_定義了兩個數(shù)組。在數(shù)據(jù)步定義了所有的數(shù)值或字符變量。在這個程序中
47、,你想把所有的從999的數(shù)值轉(zhuǎn)化成SAS缺失值。并且把所有的字母值轉(zhuǎn)換成合適的大小寫狀態(tài)。程序211234567891011121314data convert;input (A B C)($) x1-x3 y z;array nums* _numeric_;array chars* _character_;do i = 1 to dim(nums);if numsi=999 then numsi=.;end;do i = 1 to dim(chars);charsi = propcase(charsi," '");end;drop i;datalines;RON
48、jOhN mary 1 2 999 3 999;像這樣定數(shù)組將結(jié)果你大量的時間和編程精力。圖21:程序21的輸出結(jié)果A B C x1 x2 x3 y zRon John Mary 1 2 . 3 .N,NMISS, SUM和MEAN函數(shù)這類函數(shù)被稱為描述統(tǒng)計函數(shù)。函數(shù)SUM和MEAN分別計算總和和平均值。記住,這些函數(shù)忽略所有的缺失值(不同于把缺失值當作0)。函數(shù)N返回列表值中所有非零值的數(shù)目;函數(shù)NMISS返回列表值中缺失值的個數(shù)。下面的程序演示了一個非常有用的函數(shù)N、NMISS和MEAN組合。當列表數(shù)據(jù)中存在特定數(shù)量的非缺失(或缺失)值,計算出平均值。下面的程序就是這樣:程序2212345
49、67891011data descriptive;input x1-x5;Sum = sum(of x1-x5);if n(of x1-x5) ge 4 thenMean1 = mean(of x1-x5);if nmiss(of x1-x5) le 3 thenMean2 = mean(of x1-x5);datalines;1 2 . 3 4. . . 8 9;在這個程序中,僅當非缺失值個數(shù)大于或等于4時,計算Mean1;當缺失值等于或少于3個時,計算Mean2。圖22:程序22的輸出結(jié)果Sum Mean1 Mean210 2.5 2.517 . 8.5SMALLEST和LARGEST函數(shù)非常容易找到一列數(shù)值中最大(函數(shù)MAX)和最小的值(MIN),然而,想找到第二大或第二小的之類的值則非
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國集線器行業(yè)前景規(guī)劃及投資潛力分析報告
- 2025-2030年中國鑄造扣件市場發(fā)展現(xiàn)狀及前景趨勢分析報告
- 2025-2030年中國蠔油醬行業(yè)需求規(guī)模及發(fā)展趨勢預(yù)測報告
- 2025-2030年中國草柳編制工藝品市場運營狀況及投資規(guī)劃研究報告
- 2025-2030年中國自動支票打字機專用色帶行業(yè)運行態(tài)勢及發(fā)展戰(zhàn)略分析報告
- 2025-2030年中國羥丙基甲基纖維素行業(yè)十三五規(guī)劃與發(fā)展策略分析報告
- 2025-2030年中國純棉內(nèi)衣市場運營狀況及發(fā)展前景分析報告
- 2025-2030年中國科技地產(chǎn)行業(yè)競爭現(xiàn)狀及投資戰(zhàn)略研究報告
- 2025-2030年中國硫酸氧釩行業(yè)風險評估規(guī)劃研究報告
- 2025-2030年中國真空凍干蔬菜行業(yè)運行狀況及發(fā)展趨勢預(yù)測報告
- EIM Book 1 Unit 7 Learning languages單元知識要點
- 呼吸系統(tǒng)疾病與麻醉(薛張剛)
- WOMAC骨性關(guān)節(jié)炎指數(shù)評分表
- 年處理量48萬噸重整裝置芳烴精餾的工藝設(shè)計-二甲苯塔
- CRPS電源設(shè)計向?qū)?CRPS Design Guide r-2017
- 16防沖工題庫題庫(238道)
- SH/T 1627.1-1996工業(yè)用乙腈
- GB/T 5534-2008動植物油脂皂化值的測定
- GB/T 3452.2-2007液壓氣動用O形橡膠密封圈第2部分:外觀質(zhì)量檢驗規(guī)范
- GB/T 30797-2014食品用洗滌劑試驗方法總砷的測定
- GB/T 20057-2012滾動軸承圓柱滾子軸承平擋圈和套圈無擋邊端倒角尺寸
評論
0/150
提交評論