一、基礎語句
1、系統環境設定(基礎的環境設定語句)
options nodate nonumber mprint source source2 sastrace=』,d』 sastraceloc=saslog replace obs=max ps=500 ls=200 nocenter yearcutoff=1950 mergenoby=error compress=yes nosymbolgen mlogic msglevel=i;
注意:1)當在使用merge語句的時候,如果兩個資料集有重複的列名,那麼後面列的資料會覆蓋前面列,使用msglevel=i語句能夠將此情況報告出來。
2、變數設定
%let pgm = startsaspgm; 為變數pgm賦值
%let time = 20200215; 為變數time賦值
%let path = /sas/learning/pgm; 為變數path賦值,可以用在後面libname語句中
%let today = %sysfunc(today(),yymmddn8.);將今天的日期賦值到變數today中
%global pgm; 全域性變數
%local pgm; 區域性變數
%let j = eval(&j. + 1); 變數加法
另一種賦值法:proc sql
proc sql noprint;select count(distinct number) into:cnt from test1;quit;
%let xx= %left(&cnt.); 將數字變為左邊,就可以做到下面給多個變數賦值
proc sql noprint;select count(distinct number) into:cnt1-:cnt&xx. from test1;quit;
多個變數引用的時候,要加&,如:&cnt1. 和 &&cnt&xx. 前面有兩個&,因為同時引用了xx,所以是兩次引用要用兩個&
第三種賦值法:call symput
data null;
call symput(『startdate』,put(intnx(『day』,"&today."d,-1),date9.));給startdate賦值
run;
3、指定資料庫
libname testdb " /sas/learning/pgm" access=readonly; 將指定資料夾命名為testdb,就可以使用了
libname testdb 「&path.」 access=readonly; 用變數來指定
4、呼叫程式
%include 「/sas/learning/pgm/pgm.sas」;指定程式
%checksas();呼叫程式内巨集
5、其它
1)檢查檔案是否存在
%let exist = %sysfunc(fileexist(「xx/xx/xx.sas」)); 檢查某sas程式是否存在
2)檢查字元
%sysfunc(prxmatch(/[^a-z_\d]/i,&datasetname.));檢查資料集名中是否包含字元
3)列表拆開
如果乙個列表中有多個物件,用逗號隔開,如dsn_list = test1,test2,想拆開單獨賦值
%let dsn = %nrbquote(%scan(&dsn_list,&j,%str(,)));其中&j是指標,指代位置,如1代表test1,2代表test2,3則為空;另外nrbquote會將特殊字元當做正常字元賦值給dsn,以免報錯;scan (s,n<,list-of-delimiters>) 空格和引數指定的分隔符同作為分隔符判斷單詞
4)輸出文字時候,error為關鍵字,所以要拆開用cats合併來輸出(cats會去掉空格)
%put %sysfunc(cats(err,or)):invalid datase name.
5)共享結果許可權,後面是專案所在資料夾,一般放在程式最後,向所有人共享所有內容許可權
x 『chmod -rf 770 /sas/project/test』;
二、巨集程式
1、巨集程式示例
%macro checksas(num=);
%do i = 1 to &num.; 系統命令前都要加%百分號
%put &i.;
%if &i. = 3 %then %do;
%put it is time to go &i.;
%goto endmacro; 跳到endmacro所在位置
%end;
% else %do;
%put it is not the time &i.;
%end;
%do %while(&i. < 10);
%put now is &i.;
%end;
%if &i. = 20 %then %do;
%put it is the maximum &i.;
%abort cancel; 直接結束巨集程式
%end;
%endmacro:;有冒號
% end; 每個%do都要有乙個%end
%mend;
2.用goto跳出迴圈,同%abort cancel終止迴圈
三、讀取excel
options validvarname=v7; 使用excel的列名作為資料集列名
proc import out = input_data
datafile = 「/sas/learning/pgm/hello.xlsx」
dbms=xlsx replace;
getnames=yes;
sheet=「sheet1」;
run;
四、日期相關
%let today = %sysfunc(today(),date9.); 各式不同應用不同
%let today = %sysfunc(today(),yymmddn8.);
data null;call symput(『startdate』,put(intnx(『day』,"&today.「d,-1),date9.));run;計算日期後賦值給startdate
在引用日期時候,要用雙引號,後面加d,否則無效:」&today."d
五、sql相關
1、union會去重,union all不去重
proc sql;
select * from table1
union all
select * from table2;
quit;
2、cross join笛卡爾積
六、sas函式
1、sort排序函式,可以排序也可以去除重複值
proc sort data=test1;by cust;run;給test1排序,按cust公升序排
proc sort data=test1 out=test2 nodupkey;by all;run;基於所有列進行去重,結果輸出到test2
2、transpose轉置,使用轉置前要sort排序
如下,希望按照每個cust的列list1到list100進行轉置,結果為2列,cust和col1(系統預設)
proc sort data=test1;by cust;run;先按cust排序
proc transpose data=target out=target1(keep=cust col1);這裡設定結果只保留cust和col1
by cust; 按每個cust
var list1-list100; 想要轉置的目標列
run;
七、data步相關
1、data步計算日期前先定義各式,合併資料集時候也需要
data test1;
format day1 date9.;
format day2 date9;
set test;
day1 = today + number1;
day2 = today - number2;
if day1 > "&startday."d;對每個觀察值進行判斷,只有滿足if條件的才會輸出
run;
2、若想選擇資料集中每組的最後乙個,先對資料集排序
proc sort data=test;by cust;run;按cust排序
data test1;
set test;
by cust;確定分組所依賴的列
if last.cust then output;每組最後乙個輸出,如果要第乙個則用first
run;
3、資料集合並時候可能會遇到列長度不一致的問題,需要先format,但是會出warning,可以改用sql的union all
data test_new;
format cust_type $20.;
set test1
test2;
run;
SAS自學系列 SAS語句的語法
sas是現今非常流行的資料分析和資料探勘軟體,想從事資料分析行業,掌握sas很有必要。雖然sas本身提供了豐富的人機互動介面,通過手動呼叫各個menu能方便地完成資料統計分析的任務,但是,通過 來呼叫各個功能模組無疑能為工作帶來巨大的靈活性,並顯著提高效率。本文主要是根據網上找到的乙個電子文件 sa...
SAS中的if過濾語句
在sas中,if語句和where語句都有過濾作用,請看如下兩端 其效果是相同的 data a set sashelp.class if eq 男 run data a set sashelp.class where eq 男 run if 過濾語句的基本語法為 if 條件 其完整形式應該是 if 條...
SAS學習 Base SAS基礎
1 sas軟體啟動 windows環境下雙擊.exe檔案啟動。在windows環境下的示例 c c program files sashome sasfoundation 9.4 sas.exe sysin c sas code test.sas log c sas logs test.log pr...