太久沒(méi)有記錄了,上次差不多是半年前了。工作之后就太忙了,也抽不出時(shí)間來(lái)記錄。
現(xiàn)在就回來(lái)記錄一些吧,要學(xué)的有些雜,筆記也會(huì)記得很雜。
現(xiàn)在有一個(gè)任務(wù):有一個(gè)表cars,其中的make列有多個(gè)汽車品牌,現(xiàn)在依據(jù)不同的汽車品牌將表進(jìn)行拆分,每個(gè)子表對(duì)應(yīng)一個(gè)類型的汽車。
教學(xué)書中的解法:
因?yàn)橐ǘ鄠€(gè)子表,所以用到了do循環(huán),循環(huán)要用到數(shù)字1 to n,所以這里先將汽車品牌進(jìn)行映射

使用proc format的方式進(jìn)行映射,后面可以直接使用 put(&i , carname.)的方式取出對(duì)應(yīng)的品牌名。
接下來(lái)就是使用sas中的do循環(huán)來(lái)進(jìn)行循環(huán)建表了

和我想的一樣,建立一個(gè)宏函數(shù),在其中調(diào)用do循環(huán)和if判斷。
這種方法確實(shí)可行,但其實(shí)有一個(gè)巨大的坑,那就是一開(kāi)始的映射,你三個(gè)汽車品牌可以自己挨個(gè)寫,那如果有30個(gè)呢?如果有300個(gè)呢?
新的解法:
新的解法使用proc SQL與宏函數(shù)結(jié)合來(lái)解這個(gè)問(wèn)題(畢竟SQL寫得習(xí)慣了)
首先獲得汽車的品牌列表

然后定義宏來(lái)拆分表格

這里解釋一下這個(gè)sysfunc(countw(&car_brands));這一行代碼
這個(gè)countw的作用就是以空格為分割符進(jìn)行計(jì)數(shù),因?yàn)樯厦娅@取列表的時(shí)候就是用空格進(jìn)行分割的。
而sysfunc的這個(gè)函數(shù)的意思是讓一些不是宏函數(shù)的函數(shù)再宏中也能發(fā)揮作用。
%let brand = %scan(&car_brands, &i);這行命令就是取出這個(gè)值