sas sql 读取最后一行数据_SAS基础编程和数据处理
前幾天講了數據分析中SQL的基本使用方法以及具體案例分析思路,接下來會繼續講統計基礎以及在SAS軟件內的應用,在這之前,本文先進行SAS基礎使用編程的基礎介紹,后續會主要闡述SAS軟件內的統計數學的應用,如分析或初步建模等,當然了,也先推薦大家有關統計學和SAS學習的書籍:統計學的兩本書,分別是《深入淺出統計學》和《商務與經濟統計學》,關于SAS的書籍《深入解析SAS——數據處理、分析優化與商業應用》,大家看完之后,會有一個初步的認識。
本文主要介紹SAS編程和數據處理,會分為幾個部分。
一 讀取外部數到SAS數據集
1,通過使用libname..語句為一個SAS邏輯庫分配引用名(臨時邏輯庫WORK除外),但邏輯庫名不能超過8個字符,必須以字母或下劃線開頭,其余字符必須是字母,數字或者下劃線:例如,下面的SAS語句定義了一邏輯庫,引用名為saslib
libname saslib 'C:sasdata';
2,SAS變量屬性包括變量名,類型,長度,輸出格式(format),輸入格式(informat)和標簽,其中類型分為字符型和數字型,錄入,下面的SAS語句定義一部分變量
data saslib.sales;
input ID $ Dept $ Sales Date;
format Sales comma10. Date yymmdd10.;
informat Date date9.;
label ID=”員工ID” Dept=“部門” Sales=“銷售數據”;
label Date=“銷售時間”;
datalines;
上述代碼就定義了變量名以及對應的類型,長度,輸出或輸入格式。
3.查看數據集的描述信息內容,如數據集屬性內容,仍以saslib.sales為例
Proc contents data=saslib.sales;
run;
就可以看到上述定義的變量名以及對應的類型,長度,輸出或輸入格式。
二 對單個數據集的處理
1,keep或drop選取部分變量:data步可以通過讀取原數據集的部分變量來建立新數據集,仍以saslib.sales,讀取變量ID和Sales,并建立新的數據集sales1,代碼如下:
data saslib.sales1;
set saslib.sales(keep=ID Sales);
run;
proc print data= saslib.sales1;
run;
新的數據集只有兩個變量:ID和Sales,我們也可以用drop語句,指定drop=ID和Sales之外的其他變量,結果是一樣的
2,操作數據集的觀測
1)if—then語句:SAS內的條件語句,與SQL或者Excel的使用方法類似,直接舉例如下:if x<y then c=5;
else c=12;
2)if 條件表達式 then delete:使用delete語句刪除滿足條件的觀測,舉例如下:
仍然是saslib.sales數據集,尋找銷售數據(Sales)不為缺失值的觀測并建立新的數據集saslib.sales2,代碼如下:
data saslib.sales2;
set saslib.sales;
if Sales=” ” then delete;
run;
proc print data= saslib.sales2;
run;
上述代碼就可以求出銷售數據(Sales)不為缺失值數據集,也可以求出其他不為某些條件的數據集,只需把if內的條件表達式進行更改即可,舉例如下:在saslib.sales數據集中,選取ID>10的觀測輸出到數據集saslib.sales1,并將銷售數據(Sales)>100的觀測輸出到數據集saslib.sales2,代碼如下:
data saslib.sales1
saslib.sales2;
set saslib.sales;
if ID>10 then output saslib.sales1;
if Sales>100 then output saslib.sales2;
run;
proc print data= saslib.sales1;
run;
proc print data= saslib.sales2;
run;
3)if—then的賦值語句:仍然以數據集saslib.sales為例,當ID=8時,Sales提高20%,
ID=10時,Sales提高10%,其他情況,Sales都提高5%,并生成新的數據集saslib.sales3下面有幾種寫法,得出的結果是一致的,代碼如下:
data saslib.sales3;
set saslib.sales;
if ID=8 then Sales= Sales*1.2 ;
else if ID=10 then Sales= Sales*1.1;
else Sales= Sales*1.05;
run;
proc print data= saslib.sales3;
run;
第二種寫法:
data saslib.sales3;
set saslib.sales;
select (Sales)
when(8) Sales= Sales*1.2;
when(10) Sales= Sales*1.1;
otherwise Sales= Sales*1.05
run;
proc print data= saslib.sales3;
run;
以上兩種的結果是一樣的。
3 分組與排序
1)sort by過程排序:要求數據集結果內的觀測按照by語句中的變量進行升序或降序排列,仍然以數據集saslib.sales為例,要求輸出的數據集saslib.sales4按照Sales進行降序排列,代碼如下:
Proc sort data=saslib.sales out= saslib.sales4;
by descending Sales;
run;
2)找到分組的第一個和最后一個觀測:仍然以數據集saslib.sales為例,取每組ID內最高和最低的Sales,生成新的數據集saslib.sales2,代碼如下:
data saslib.sales2;
set saslib.sales;
by ID;
if first.ID or last.ID;
run;
4,循環和數組
1)迭代do語句:基本形式為
do 索引變量=開始值< to 結束值><by 遞進值><while (表達式)><until(表達式)>;
SAS語句;
End;
舉例如下:使用do循環生成數據集do1,數據集包含變量x和y,x的值為1、3、5,y為x的平方。代碼如下:
Data work.do1;
do x=1 to 5 by 2;
y=x**2;
output;
end;
run;
2)do until語句:重復執行do循環的語句,直到條件為真。基本形式如下
do until (表達式);
SAS語句;
end;
舉例如下:將給定字符串中包含的各個單詞分開寫入數據集中
data work.all;
length word $20;
drop string;
string=”the quick brown fox jumps over the lazy dog”;
do until(lengthn(word)=0);
count+1;
word=scan(string,count);
output;
end;
結果如下:
三 對多個數據集的處理
1,數據集的縱向串聯
1)set語句縱向串聯:基本形式如下
Data 新數據集;
set 數據集1 數據集2………;
Run;
舉例如下,對數據集work.New1和work.New1進行縱向串聯,生成新的數據集work.New12,代碼如下:
data work.New1;
input Emp_ID $ Emp_Name $ @@;
datalines;
ET001 Jimmy ED003 Emy EC002 Alfred EQ004 Kim
;
run;
data work.New2;
input Emp_ID $ Emp_Name $ @@;
datalines;
EQ122 Molly ET121 Dillon ET124 Helen ED123 John
;
run;
data work.New12;
set work.New1 work.New2;
run;
proc print data=work.New1;
run;
proc print data=work.New2;
run;
proc print data=work.New12;
run;
結果如下:
2)by 語句穿插串聯:所有舒服數據集先按照by變量排序,新的數據集也將按照該排序,基本形式如下:
Data 新數據集;
set 數據集1 數據集2………;
by 變量1 變量2…………;
Run;
2,merge by數據集的橫向合并:使用by語句,也稱為匹配合并,注意在使用by語句時,輸入數據集必須按照by變量排序。這個點就不舉例子了,和上篇文章內的SQL類似。
3,數據集的更改
modify語句進行單個數據集的更改:運用該語句可以更改原數據集中的變量,但是不能再原數據集中添加或者更改,舉例如下:數據集work.inventory中包含產品,庫存和價格的信息,先決定將每個產品的價格提高15%,代碼如下:
data work.inventory;
modify work.inventory;
price=price*1.15;
run;
proc print data=work.inventory noobs;
run;
前后代碼結果為:
4,使用自動變量first.與last.:data步如果使用了by語句,會自動生成兩個數值型自動變量first.與last.變量,分別用來辨識by組合的第一條和最后一條觀測,舉例如下:
數據集Sales中包含了每位員工的銷售額和員工所屬部門以及性別數據,統計各部門男員工和女員工的總銷售額,代碼如下:
首先將數據集Sales按照Dept和Gender排序,在運用first.與last.變量計算:
proc sort data=work.sales;
by Dept Gender;
run;
data work.sales_dept;
set work.sales;
by Dept Gender;
retain sales_by_dept;
if first.Gender then
sales_by_dept=0;
sales_by_dept=sales_by_dept+sales;
if last.Gender;
keep Dept Gender sales_by_dept;
run;
proc print data=work.sales_dept noobs;
title 'Sales by Department by Gender';
run;
前后圖表如下:
5,使用hash對象處理多個數據集:基本形式如下:
Declare object hash 對象名(<主題1:內容1 <,主題2:內容2,…………>>);
Hash 對象名.definekey(<主題1:內容1 <,主題2:內容2,…………>>);
Hash 對象名.definedata(<主題1:內容1 <,主題2:內容2,…………>>)
Hash 對象名. Definedone()
第一行定義hash的對象名稱,第二行和第三行分別定義了對象的key變量和data變量,第四行表示hash對象定義結束。下面舉例說明:
公司現有庫存1000臺汽車,每臺車可以發往各個倉庫,但是不同倉庫給公司帶來的邊際收益不同,而且每個倉庫有一定的容量限制,現在求每個倉庫發多少車,同時公司的效益最高,下面是倉庫收益數據集expected_profit和倉庫容量數據集warehouse_constraint部分數據如下圖:
代碼如下:data work.allocation;
retain total_cars_before 1000;
length warehouse_id $6;
if _N_=1 then
do;
declare hash constraint(dataset: "work.warehouse_constraint");
constraint.definekey('warehouse_id');
constraint.definedata('capacity');
constraint.definedone();
call missing(warehouse_id,capacity);
end;
set work.expected_profit;
rc = constraint.find();
if rc = 0 and capacity>=1 and total_cars_before>=1 then
do;
capacity=capacity-1;
total_cars_after=total_cars_before-1;
rc=constraint.replace(key:warehouse_id, data: capacity);
if rc=0 then
do;
output work.allocation;
total_cars_before=total_cars_before-1;
end;
else put "Error: Replace capacity failed!";
end;
else if rc ne 0 then
put "Error: Failed to find warehouse capacity!";
keep warehouse_id capacity profit_margin total_cars_before total_cars_after;
run;
結果如下:
至此,SAS基本的編程就說完了,后續會進行SAS的統計與初步建模探討。
總結
以上是生活随笔為你收集整理的sas sql 读取最后一行数据_SAS基础编程和数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 写一个计算器_java编写一个
- 下一篇: 文件打开特别慢_“Origin进不去、下