/** 讀入資料,生成sas資料集work.productapurchase
(work為sas預設的工作邏輯庫,引用其中的資料集時可省略「work.」)**/
data productapurchase;
infile 'e:\data\ch2_productapurchase.csv' delimiter = ',' firstobs=2;
/*delimiter = `,`指明由逗號分隔,firstobs=2指明從第二行開始讀資料*/
informat date yymmdd10.;
/*第乙個變數名為date,輸入格式為sas中的日期格式yymmdd10.,
即4位數年+2位數月+2位數日,年與月之間、月與日之間以「-」分隔*/
informat accountno $3.;
/*第二個變數名為accountno,輸入格式是長度為3的字串*/
informat amount best32.;
/*第三個變數名為amount,輸入格式為sas中的數值格式best32.*/
format date yymmdd10.;
/*第乙個變數date在sas中輸出格式為yymmdd10.*/
format accountno $3.;
/*第二個變數accountno在sas中輸出格式是長度為3的字串*/
format amount best32.;
/*第三個變數amount在sas中輸出格式為best32.*/
input date accountno amount;
/*從檔案中讀取三個變數的具體資料*/
run;
proc print data=productapurchase(obs=5);
run;
/** 讀入資料,生成sas資料集work.productbpurchase **/
data productbpurchase;
infile 'e:\data\ch2_productbpurchase.csv' delimiter = ',' firstobs=2;
informat date yymmdd10.;
informat accountno $3.;
informat amount best32.;
format date yymmdd10.;
format accountno $3.;
format amount best32.;
input date accountno amount;
run;
proc print data=productbpurchase(obs=5);
run;
/** 讀入資料,生成sas資料集work.demographics**/
data demographics;
infile 'e:\data\ch2_demographics.csv' delimiter =',' firstobs=2;
informat accountno $3.;
informat age best32.;
informat gender $1.;
format accountno $3.;
format age best32.;
format gender $1.;
input accountno age gender;
run;
proc print data=demographics(obs=5);
run;
/**將sas資料集work.productapurchase按客戶號accountno的公升序排列**/
proc sort data=productapurchase;
by accountno;
run;
/**計算各客戶在1月份消費部門a產品的次數和總金額**/
proc sql;
/*sas中可使用sql語句處理資料和進行資料檢索*/
create table tempa_06_01 as
/*產生資料集work.tempa_06_01*/
select accountno, count(*) as count_transa_06_01,
sum(amount) as amount_transa_06_01
from productapurchase
where date
group by accountno
order by accountno;
/*從productapurchase資料集中選出日期2月1日之前的資料,
按照客戶號分組分別計算出三個變數放入work.tempa_06_01,
並按照客戶號的公升序排列:
accountno直接來自於productapurchase,
count_transa_06_01為觀測的數目,
amount_transa_06_01為amount變數的和。
注意:sql語句中的「group by accountno」要求資料集productapurchase
按照accountno的公升序排列,所以前面使用了sort過程*/
quit;
proc print data=tempa_06_01(obs=5);
run;
/**計算各客戶在2月份消費部門a產品的次數和總金額**/
proc sql;
create table tempa_06_02 as
select accountno, count(*) as count_transa_06_02,
sum(amount) as amount_transa_06_02
from productapurchase
where date>='01feb06'd
group by accountno
order by accountno;
quit;
proc print data=tempa_06_02(obs=5);
run;
/**將sas資料集work.productbpurchase按客戶號accountno的公升序排列**/
proc sort data=productbpurchase;
by accountno;
run;
proc print data=productbpurchase(obs=5);
run;
/**計算各客戶在1月份消費部門b產品的次數和總金額**/
proc sql;
create table tempb_06_01 as
select accountno, count(*) as count_transb_06_01,
sum(amount) as amount_transb_06_01
from productbpurchase
where date
group by accountno
order by accountno;
quit;
proc print data=tempb_06_01(obs=5);
run;
/**計算各客戶在2月份消費部門b產品的次數和總金額**/
proc sql;
create table tempb_06_02 as
select accountno, count(*) as count_transb_06_02,
sum(amount) as amount_transb_06_02
from productbpurchase
where date>='01feb06'd
group by accountno
order by accountno;
quit;
/**將sas資料集work.demographics按客戶號accountno的公升序排列**/
proc sort data=demographics;
by accountno;
run;
/**將客戶背景資訊和前面計算出的消費資訊合併成乙個資料集**/
data demoproducts;
/*合併後的資料集是work.demoproducts*/
merge demographics tempa_06_01 tempa_06_02 tempb_06_01 tempb_06_02;
by accountno;
/*將五個資料集按照客戶號accountno合併在一起。
注意:合併時「by accountno」要求各資料集按照accountno的公升序排列,
所以前面使用了sort過程排列work.demographics資料集*/
SAS對資料變數的處理
在使用data步基於已經存在的資料集生成新資料集時,可以指定在新資料集中不需要包含的變數而僅讀取其他變數,或者指定僅需要在 新資料集中包含的變數。該功能可以通過data步中的set語句和資料集選項keep 和drop 來實現,也可以通過keep和drop語句來實現。使用資料集選項keep 和drop...
資料處理取對數的作用
對資料做一些變換的目的是它能夠讓它符合我們所做的假設,使我們能夠在已有理論上對其分析。對數變換 log transformation 是特殊的一種資料變換方式,它可以將一類我們理論上未解決的模型問題轉化為已經解決的問題。我將說兩模擬較有代表性的模型。這句話交代了假設,也就是說,數學模型在實際問題的應...
資料處理使用對數的原因
1.對數函式影象 2.平時在一些資料處理中,經常會把原始資料取對數後進一步處理。之所以這樣做是基於對數函式在其定義域內是單調增函式,取對數後不會改變資料的相對關係,取對數作用主要有 1 縮小資料的絕對數值,方便計算。例如,每個資料項的值都很大,許多這樣的值進行計算可能對超過常用資料型別的取值範圍,這...