日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sas sql 读取最后一行数据_SAS基础编程和数据处理

發布時間:2025/3/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基础编程和数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。