1樓:
我想知道巨集裡面為什麼用keep &a &b; 保留a,b代替的變數會被sas說syntax error,被當成&符號處理
2樓:大象
SAS的語法其實很簡單,SAS是一種面向過程的語言,其有兩個主要部分構成:Statements 和 Options。
1.Statement
Statements就是SAS中的語句,是SAS程式的主幹,主要告訴SAS需要進行哪些操作,用分號 ';' 結尾。而Statements由SAS關鍵字,SAS名稱,特殊符號和運算子構成。
例如 DATA a; 就是乙個DATA Statement。DATA就是乙個sas關鍵字,a就是乙個sas名稱。又比如 length x $10.
; 就是乙個length Statement,x是乙個sas名稱,'$'和'.'是特殊符號。
函式是SAS Statement的一種特殊組成部分,能接收輸入,並返回輸出。函式名稱後面跟著小括號,小括號裡面的引數用逗號分隔開。例如 x = substr(y,1,10);這個Statement由名稱x,賦值運算子= 和substr函式組成,其中y,1和10都是函式的引數。
A SAS statement is a string of SAS keywords, SAS names, special characters, and operators that instructs SAS to perform an operation or that gives information to SAS. Each SAS statement ends with a semicolon.
SAS 9.3 Statement References
2. Options
Options就是SAS中的選項,用來修飾Statements,主要告訴SAS怎樣進行這些操作。options根據修飾的物件不同,其語法不相同,但多個option存在時,之間都用空格分隔。
1. 當options修飾SAS資料集時,用小括號把options框起來。
2.當options修飾SAS關鍵字的時候,則只用空格將options與主幹分隔。
3. 在Proc步驟中,除了Proc statement以外,其他修飾statement的options則需要用反斜槓'/'與主幹分隔開。
例如:Data a(where = (x = 2));這個語句由主幹 Data a和選項where = (x = 2)組成。其中where = (x = 2)修飾SAS名稱:
資料集名a,所以用括號括起來。
Infile x dlm=',' dsd missover;這個語句主幹是Infile x ,dlm=『,』 dsd 和missover都是修飾infile的選項。因此滿足情況2.
model y = x1 x2 x3/ stb vif; 是從屬於Proc Statement的model statement,stb和vif都是修飾這個model的options,與主幹用'/'分隔開,但內部用空格分隔。
注意:單獨的where x = 2;是where statements,不是options。options一定是要有修飾物件的。
附:一些特殊符號
1. 點號'.'。
SAS中的點號。主要會出現在三個地方:邏輯庫.資料集、SAS Format和巨集變數中,主要起到分隔的作用。例如$10. 表示的是$10這樣乙個Format名稱。
又如%let a = mylib; data &a..mydataset; 第乙個.代表分隔巨集變數&a 和後面的.
mydataset,而第二個.則是邏輯庫.資料集裡面的分隔符。
data &&a&i...mydataset; 這裡三個點的前兩點分別表示表示分隔巨集變數&&a&i 和 &ai。
2. 逗號','。
逗號用來分隔引數。比如函式的引數和巨集的引數。此外,在SQL中,由於SQL語言本身的特性,逗號也用來分隔變數。
比如select *, x1 as var1, x2 as var2 from mylib.mydataset; 就是乙個select Statement。其中變數名用逗號分隔。
3. Trail 符號 『@』。
SAS 中的@是指標控制符。用來規定指標的位置,@numerical expression的話,就是把指標移動到該expression所指向的位置。如果@在input語句末尾,則代表將指標停留在資料行的末尾直到執行下乙個input語句。
如果是@@在input語句末尾,則代表將指標停留在資料行的末尾直到執行下乙個data步。
3. 井號 『#』。
換行符號,制定指標讀取的行數。
4. 引號。
分為單引號和雙引號,其中單引號內部的巨集不解析,雙引號內部的巨集要解析。此外,單引號用在在call symput和call symget語句中定義巨集變數。
5. 百分號%。
用來定義巨集語句,%開頭的語句有優先編譯權。
例如%let x = 2;
data a;
%if &x = 2 %then %do;
var1 = 1;
%end;
run;
先編譯%開頭的語句得到
data a;
var1 = 1;
run;
然後在編譯這段程式。
6. Ambersand 號『&』。
用來引用巨集變數,可以巢狀。
7. 分號 ';'。
用來分隔Statements, 每乙個statement有且只有乙個;。
8. 冒號 ':'。
這個出現的地方就比較多了。常見在input語句裡面,用來修飾Format,比如$10. 會定義乙個長度為10的字串,如果檔案中的字串長度不到10,那就把分隔符也當做字串的一部分往後讀,直到讀完10個長度。:
$10.則避免了這個問題。有時候在SQL裡面也會看到,select into語句中,用在定義的巨集變數名稱前。
還有其他的作用可以參考這個文章:
如何零基礎自學SAS? - 大象的回答
有哪些學習屈折語時內化語法規則的突破方法?
肖深刻的九叔 謝題主邀。是的,懂 理解語法規則 不等於會 在真實情境能表達出來 必須要進行訓練。可以進行 聽說訓練 Hren und Sprechen 當代大學德語 德語專業教材 和 新標準德語強化教程 德國原版教材 這兩套教材前幾個級別都含有一冊聽說訓練的冊子。聽說訓練其實主要是在聽和說中進行成分...
SAS入門書籍有哪些值得推薦?
寧靜致遠往事隨風 我零基礎入門,看了一些教材的感想 1.入門推薦馮國雙老師的 小白學SAS 和 The SAS Little Book 簡單易懂 2.有一點基礎了,推薦谷鴻秋老師的 SAS程式設計演義 可以對SAS有乙個整體的學習和思路 3.上手統計,推薦馮國雙老師的 醫學案例統計分析與SAS應用 ...
Python 有哪些糟糕的語法?
a b 向下取整完全可以用int a b 實現,不如直接把 做成和其他語言裡 一樣的功能 比如 很多語言裡 23 10 2但是Python裡 23 10 3 李之瀚 不常用的,你用不好的都不算糟糕,只能說你不會用不得要領。個人認為有點糟糕的,懂得人自然懂我在說什麼 type 較之 isinstanc...