熱線電話:13121318867

登錄
首頁精彩閱讀SAS SQL select…into語句創建宏變量巧妙解決問題的總結
SAS SQL select…into語句創建宏變量巧妙解決問題的總結
2017-03-29
收藏

SAS SQL select…into語句創建宏變量巧妙解決問題的總結

今在某SAS交流群看到這樣一個問題如下:

有一個數據集a,有三個變量c,b,d(他們在數據集中的順序也是如此),想新建一個變量var,并添加到b和d中間,怎么做?

我想的代碼如下:

/*將原數據集變量名稱存放在宏變量中*/

proc sql ;

select name into :names separated by ","

from dictionary.columns

where libname="SASHELP" and memname="CLASS";

quit;

%put &names;

/*解析宏變量,插入新變量名稱,在放入宏變量*/

data test;

vars="&names";

vars_new=tranwrd(vars,"Sex","Sex,'newvar' astest");

call symput("new_names",vars_new);

run;

%put &new_names;

/*在原數據集中插入新變量*/

proc sql;

create table test as

select &new_names

from sashelp.class;

quit;

這個問題思路很簡單,把原數據集變量組裝如宏變量,再按要求修改,再組裝到一個宏變量。在實際工作中可能基本不會遇到,如果遇到一般也是采用數據集間的橫向合并去解決這個問題。

在這里想說的是,怎么巧妙運用SQL里select…into語句。如果你一直關注本公眾號的文章,你會發現在最近的文章里都涉及到該語句的使用,一個文件夾下文件的批量導入、一個EXCEL工作薄中不規則sheet名稱的批量導入,邏輯庫多個數據集的批量導出、變量的批量處理,數據集的批量合并等等,都巧妙的應用了select…into..語句。

要巧妙運用該語句,有時還需要理解下SAS的dictionary table(字典數據表)的應用。首先需要字典數據表是什么,通過view字典數據表如下可知,通俗的說就是存放數據集基本信息的數據表,這個表包括存放列(columns)、存放數據集名稱(memname)和存放數據集所在邏輯庫名稱(libname)的數據表。

1.查詢數據集變量名稱 ,如果要把某數據集的變量名稱抽提出來就如上述例子;從dictionary.columns里查詢name;

2.查詢數據集名稱 如果要對某邏輯庫的不同數據集進行批量,就把該邏輯庫的所有數據集名稱放入宏變量。就從dictionary.tables.

proc sql;

select memname INTO :memnames

from dictionary.tables

where libname="WORK";

quit;

3.查詢邏輯庫名稱  如果想對不同邏輯庫進行操作,將邏輯庫名稱放入宏變量。

proc sql;

select distinct(libname) 

INTO:memnames separated by ","

from dictionary.tables;

quit;

注意的問題:

(1)以上查詢也都可以在dictionary.indexes里查詢,變量名稱、數據集和邏輯庫對應名稱為name、memname和libname。

(2)變量名稱、數據集和邏輯庫名稱存放形式均為嚴格的大寫。如where libname="WORK";因此在查詢時需注意大小寫,如果小寫需要upcase下。

(3)需要根據宏變量運用的場景選擇不同的分隔符,如sas base模塊中多個變量間不需要逗號隔開,這時宏變量變量名稱存放時分隔符就該是空格,相反在SQL中多個變量并放時,需要逗號作為分隔符,這時需要逗號分隔名稱等等,總之首先需要考慮宏變量的運用場景添加合適的分隔符分隔名稱。

4.數據集變量數和觀測數

proc sql;

select nobs,nvar into:nobs,:nvars

from dictionary.tables

where libname="WORK" and memname="TEST";

quit;

5.跨邏輯庫數據集名稱 從多個邏輯庫里查詢數據集,并批量導出。

/*不同邏輯庫不同數據集*/

proc sql;

select  distinct trim(libname||"."|| memname)

into :libnames separated by " "

from dictionary.indexes;

quit;

%put &libnames;

綜上,想怎么操作,就看你的解決問題的思路了。很簡單,問題簡單化,就是這么簡單和任性。

理解了以上問題,在處理批量問題時其實是很簡單的。請結合以前發的文章進行理解,當然還有很多別的應用,只要是能想到的,你能把它轉化為sas能識別的語言,一切很簡單。

1. 導入含有多個不規則EXCEL子表名稱的數據 ——SAS+EXCLE合作更有效

2. SAS data步、SQL和宏解決多表(≥3)合并問題

3. 一段宏解決TOPSIS綜合評價問題,寫文章也就是批量生產的問題

4. Sas應用之解決多個文件數據資源的批量導入問題

5. Sas 數組、宏應用之批量更改變量類型。


SQL

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢