2008年1月26日 星期六

讓你的ODS PRINTER Statement進入21世紀

原文出處:http://www2.sas.com/proceedings/sugi31/227-31.pdf




繼ODS再次進化後,ODS PRINTER從8.2版本到目前的9.2版本,其報表輸出多了很多編修方式,Scott Huntley, Cary,則提出了一些輸出為PDF檔的方法

起初的ODS語法可以先參考ODS的應用ODS的應用2


options nonumber nodate;
ods escapechar = "^";
ods pdf file="example1.pdf";
title1 "^S={just=L }This title is blue and left justified";
title2 "^S={just=R }This title is red and right justified";
title3 "^S={just=C }This title is green and centered";
proc print data=sashelp.class(obs=1);run;
ods _all_ close;



escapechar = "^"是用來使^S={ }在TITLE中有作用的語法使得下方說明能夠有作用
而依照作者所說明,^S={ }可以埋入文字標題字串內,且是用來定義文字標題字串內各種形式的文字輸出,有點類思WORD中的文字編輯,而支援的語法有以下
ABSTRACT, ACTIVELINKCOLOR, ASIS, BACKGROUND, BACKGROUNDIMAGE, BODYSCROLLBAR, BODYSIZE, BORDERCOLOR, BORDERCOLORDARK, BORDERCOLORLIGHT, BORDERWIDTH, BOTTOMMARGIN, BULLET, CELLPADDING, CELLSPACING, CONTENTPOSITION, CONTENTSCROLLBAR, CONTENTSIZE, CONTRASTCOLOR, CSSSTYLE, CSSTEXT, DESCRIPTION, DROPSHADOW, ENDCOLOR, FILLRULEWIDTH, FLYOVER, FONT, FONT_FACE, FONT_SIZE, FONT_STYLE, FONT_WEIGHT, FONT_WIDTH, FOREGROUND, FRAME, FRAMEBORDER, FRAMEBORDERWIDTH, FRAMESPACING, GRADIENT_DIRECTION, HREFTARGET, HTMLCLASS, HTMLCONTENTTYPE, HTMLDOCTYPE, HTMLID, HTMLSTYLE, IMAGE, IMAGESTYLE, INDENT, JUST, LEFTMARGIN, LINESTYLE, LINETHICKNESS, LINKCOLOR, LISTENTRYANCHOR, LISTENTRYDBLSPACE, MARKERSIZE, MARKERSYMBOL, MINOR, NEUTRALCOLOR, NOBREAKSPACE, OFFSET, OUTPUTHEIGHT, OUTPUTWIDTH, OVERHANGFACTOR, PAGEBREAKHTML, POSTHTML, POSTIMAGE, POSTTEXT, PREHTML, PREIMAGE, PRETEXT, PROTECTSPECIALCHARS, RIGHTMARGIN, RULES, STARTCOLOR, TAGATTR, THRESHOLD, TICKDISPLAY, TOPMARGIN, TRANSPARENCY, URL, VISITEDLINKCOLOR, VJUST, WATERMARK


可能因SAS版本不同所以吾的^S={ }有稍微差異(9.2版本),不過對於標題的修改可以參照title的說明就可以修改了如下

title3 color=red "^S={just=C }This title is green and centered";



稍微整理後如下

options nonumber nodate;
ods escapechar = "^"
ods pdf file="example1.pdf";
title1 color=red "^S={just=l}This title" color=blue " is blue and left justified";
proc print data=sashelp.class;
run;
ods _all_ close;







當然為了讓輸出更為多樣化,吾也適度修改了內容以達到報表的美觀

options nonumber nodate;
ods escapechar = "^";
ods pdf file="example1.pdf" style=sasweb;
title color=red "^S={just=l font_size=10}This is kingbee " color=blue " testing ";
footnote color=blue "This is tesitng for PDF output" ;
proc print data=sashelp.class;
run;
ods pdf text="測試用的資料";
ods _all_ close;



而其中用到了style=sasweb,為ODS的輸出時報表的美觀
另外ods pdf text="";,是可以將想要寫入報表的文字敘述用的方法

2008年1月18日 星期五

proc timeplot

繪製時間圖

繪製時間圖

原文出處:http://www2.sas.com/proceedings/forum2007/029-2007.pdf




雖然SAS提供有利的函數LAG,有利於對有重複相關的觀察值來做時間上的差值計算,例如第一筆與第二筆觀察值是同一個人只是時間上的前後,所以可以利用LAG函數來做時間差計算
所以原作者Pon Su提供一種方便的計算方式,並利用SAS的程序PROC TIMEPLOT來美化時間資料
以下為作者提供之範例可供使用者直接套用練習

options center nodate nonumber ls=64;
data temp;
input id startdt:mmddyy8. stopdt:mmddyy8. ;
datalines;
101 01/01/05 01/09/05
101 01/05/05 01/20/05
101 01/16/05 01/18/05
101 01/26/05 01/31/05
102 01/01/05 01/07/05
102 01/05/05 01/07/05
102 01/06/05 01/17/05
102 01/14/05 01/27/05
102 01/29/05 01/31/05
;
run;

*範例中可以看到編號(ID)中有前後兩個時間點資料,並以下方語法做處理,而重點在於使用了LAG函數來加以處理時間資料;
data temp1;
set temp;
format startdt stopdt lagstop mmddyy8. ;
real_days = stopdt - startdt + 1;
lagstop =lag(stopdt);
if id = lag(id) then
if lagstop >= stopdt then
real_days = 0;
else if lagstop >= startdt then
real_days = stopdt - lagstop;
run;

****************************************************************************;
* The following comments are copied from SAS Procedure Guide manuals. ;
* The TIMEPLOT procedure plots one or more variables over time intervals. ;
* OVERLAY plots all requests in one plot statement on one set of axes. ;
* HILOC connects the leftmost plotting symbol to the rightmost with hyphens.;
****************************************************************************;
title "SGF 2007 Coders' Corner Demo";
*並將上述時間處理呈現出來,利用了以下語法PROC TIMEPLOT;
proc timeplot data=temp1;
plot startdt ='<' stopdt='>' / overlay ref='15JAN05'd hiloc;
by id;
run;

*作者再簡單的將時間資料做呈現;
proc print data=temp1;
run;

proc sql;
select id, sum(real_days) as duration_in_days
from temp1
group by id
order by id;
quit;


最後如下圖





以下為我適度修改後的說明
1.時間資料的建立

data king1;
input ID Pretime: mmddyy10. Posttime: mmddyy10. ;
cards;
1 01/01/2006 05/01/2006
1 05/02/2006 01/01/2007
1 12/01/2006 01/15/2008
2 12/05/2005 01/06/2007
2 09/16/2007 12/02/2007
2 11/29/2007 01/15/2008
3 01/01/2005 01/02/2008
3 04/04/2006 01/15/2008
3 02/01/2007 01/02/2008
;
proc print;
run;


需要先宣告時間變項的時間格式如mmddyy8.或是mmddyy10.,而主要目的是先將資料轉為SAS的內置日期(1960年1月1日為起始)距離今天的"日數",例如時間為01/22/1977以mmddyy10.為格式,則SAS內建日期為6231日,而其他日期格式請參考SAS說明
以上是建立時間之資料方式,若使用者有自行的時間資料時,只要能夠轉換為SAS內建日期就可以直接接續下一步了

2.時間資料繪製

proc timeplot data=king1;
plot Pretime ='<' posttime='>' / overlay ref='15JAN05'd hiloc;
by id;
run;


其中overlay是用在圖的重疊(若是使用proc gplot有多張點圖重疊),在此是將時間圖畫的Pretime與posttime重疊起來,如<_____>
ref='15JAN05'd為時間基準線,只要修改引號內的時間(date.)
hiloc為重疊後將時間用連接線連起來,如<--------->

2008年1月9日 星期三

MACRO

利用MACRO語法將SAS資料直接繪至成EXCEL圖檔

Receiver Operating Characteristic (ROC) Curves

利用MACRO語法將SAS資料直接繪製成EXCEL圖檔

原文出處:http://www2.sas.com/proceedings/forum2007/002-2007.pdf


此原文作者Ted Conway, Chicago, IL介紹利用SAS中的MACRO語法配合Visual Basic語法來實現大量資料檔其描述性統計特性:長條圖(Bar)與線(Line)圖

此法概念來自於原出處如下圖

步驟如下

1.先建立SAS MACRO語法定義EXCEL圖檔
2.利用SAS執行時將建立的MACRO語法轉換為EXCEL的VBA語言
3.再將VBA語言表現在EXCEL資料表上並繪製出圖檔




1.先將以下MARCO匯入SAS並執行

作者提供的MACRO語法


%macro chart(type, name=, charttype=bar, across=1, cell=a1, data=, catvar=, xvar=, yvar=, yformat=, ymin=0, ymax=, yint=);
%if &type=workbook %then %do;
%global gblworkbook; %let gblworkbook=&name;
data _null_;
file "c:\temp\chart.vbs" mod; * Note: .vbs file should not exist at start of processing;
put 'Set XL = CreateObject("Excel.Application")' / 'XL.Visible=True' /
'XL.Workbooks.add' / "XL.ActiveWorkbook.SaveAs ""&gblworkbook"", -4143";
%end;
%if &type=worksheet %then %do;
data _null_; file "c:\temp\chart.vbs" mod; put "XL.Sheets.Add.name = ""&name"""; %global gblworksheet; %let gblworksheet=&name;
%end;
%if &type=chart %then %do;
proc sql noprint;
select distinct &catvar into :categories separated by '|' from &data order by &catvar;
%let catnum=1;
%let cat=%scan(&categories,&catnum,'|');
%do %while("&cat"^="");
%let lrow=%eval(%sysfunc(floor(%eval(&catnum-1)/&across))+1);
%let lcol=%sysfunc(mod(&catnum,&across));
%if &lcol=0 %then %let lcol=&across;
data _null_;
set _last_(where=(&catvar="&cat")) end=eof;
length xvalues yvalues $ 32000;
retain xvalues yvalues '';
xvalues=trim(xvalues)||'""'||trim(&xvar)||'"",';
yvalues=trim(yvalues)||trim(&yvar)||',';
if eof;
file "c:\temp\chart.vbs" mod;
put "XL.windows(""%scan(&gblworkbook,-1,'\')"").Activate" / 'XL.Range("A1").Select' / "XL.Charts.Add";
%if &charttype=bar %then put "XL.activechart.ChartType = 51";; %if &charttype=line %then put "XL.activechart.ChartType = 4";;
put "XL.activechart.SeriesCollection.NewSeries" / "XL.activechart.SeriesCollection(1).XValues = ""={" xvalues +(-2) '}"' /;
put 'XL.activechart.SeriesCollection(1).Values = "={' yvalues +(-2) '}"' / 'XL.activechart.SeriesCollection(1).Name = "=""' "&cat" '"""' /
'XL.activechart.Location 2, "' "&gblworksheet" '"'; *2=xlLocationAsObject;
put 'XL.activechart.Axes(1).MajorTickMark = -4142' / 'XL.activechart.Axes(1).MinorTickMark = -4142' / 'XL.activechart.Axes(2).MajorTickMark = -4142' /
'XL.activechart.Axes(2).MinorTickMark = -4142' / "XL.activechart.Axes(2).MinimumScale = &ymin" / "XL.activechart.Axes(2).MaximumScale = &ymax" /
"XL.activechart.Axes(2).MinorUnit = &yint" / "XL.activechart.Axes(2).MajorUnit = &yint" / 'XL.activechart.Axes(2).TickLabels.NumberFormat =' ""&yformat"";
put 'x = XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).Left';
%if &lcol=1 %then
put 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).Left = XL.worksheets(' """&gblworksheet"""
').Columns(' "XL.range(""&cell"").column" ').Left'%str(;);
%else %do;
put 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).left = _';
put 'XL.worksheets(' """&gblworksheet""" ').Columns(' "XL.range(""&cell"").column" ').Left + _';
put "(&lcol-1) * " 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).width';
%end;
put 'XL.activechart.Legend.Delete';
%if &lrow=1 %then
put 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).Top = XL.worksheets(' """&gblworksheet"""
').Rows(' "XL.range(""&cell"").row" ').Top'%str(;);
%else %do;
put 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).Top = _';
put 'XL.worksheets(' """&gblworksheet""" ').Rows(' "XL.range(""&cell"").row" ').Top + _';
put "(&lrow-1) * " 'XL.worksheets(' """&gblworksheet""" ').ChartObjects(XL.worksheets(' """&gblworksheet""" ').ChartObjects.Count).height';
%end;
%let catnum=%eval(&catnum+1);
%let cat=%scan(&categories,&catnum,'|');
%end;
%end;
%if &type=create %then %do;
data _null_; file "c:\temp\chart.vbs" mod; put "XL.ActiveWorkbook.Save"; run; x 'c:\temp\chart.vbs';
%end;
%mend;




2.將SAS MACRO語法執行並將起始語法設定好
依照原作者,在MACRO語法中共分為四個步驟皆是以%chart();開頭

1.%chart(workbook, name=c:\temp\chart.xls);
2.%chart(worksheet, name=TestBar);
3.%chart(chart, charttype=bar,cell=a1, across=1, data=work.king , catvar=catvar , xvar=xvar , yvar=yvar, yFormat="#,##0" , ymax=10000, yint=2000 );
4.%chart(create);




Step 1.%chart(workbook, name=c:\temp\chart.xls);
需先存在workbook關鍵字,並在name=後面打上excel未來的存放位置,預設值為c:\temp\chart.xls,若遇到繪出位置無該資料夾則須先自行建立該資料夾,如c:內無temp資料夾,則自行先建立temp資料夾方可使用

Step 2.%chart(worksheet, name=TestBar);
須先打上worksheet,為excel檔案內的分頁,並將命名為name=TestBar,也可自行命名其他分頁名稱

Step 3.%chart(chart, charttype=bar,cell=a1, across=1, data=work.king , catvar=catvar , xvar=xvar , yvar=yvar, yFormat="#,##0" , ymax=10000, yint=2000);
須先打上chart
charttype=bar,為輸出在EXCEL檔時圖檔為bar,也可打line
cell=a1,為圖檔的起始位置,此為EXCEL檔內a1 cell的位置
across=1,為圖檔並排的數目,若圖檔預計有10張,若across=2則左右會有兩張並排而垂直會有5張
data=,為SAS程式內欲輸出的檔案
catvar=,為SAS檔案欲輸出的分層變項(須為文字型態),內有十層即可繪製出10張圖檔
xvar=,為SAS檔案中欲繪製在EXCEL圖檔中x軸的變項(須為文字型態)
yvar=,為SAS檔案中欲繪製在EXCEL圖檔中y軸的變項(須為數字型態)
yFormat="#,##0",EXCEL圖檔中y軸座標格式,可加也可不加
ymax=10000,顧名思義為y軸資料的最大值
yint=2000,為y軸資料個間距

Step 4.%chart(create);
打上create做為結尾的部份,打上此段語法後SAS執行完就會將資料繪製到EXCLE檔圖檔中

附註:Step 3. 可重複出現例如同時繪製chart與line圖 可以在語法中打2組Step 3.的語法


實測如下

data king;

input catvar$ xvar$ yvar;

cards;
1 5000 200
1 4000 300
1 2000 400
1 3000 200
1 1000 200
1 3000 200
2 1000 300
2 2000 500
2 3000 100
2 2000 200
2 5000 200
3 1000 100
3 3000 200
3 5000 600
3 2000 1000
3 10000 1500
;
run;


%chart(workbook, name=c:\temp\chart.xls);
%chart(worksheet, name=king);
%chart(chart, charttype=bar,cell=a1, across=1, data=work.king , catvar=catvar , xvar=xvar , yvar=yvar, yFormat="#,##0" , ymax=10000, yint=2000 );
%chart(create);




完成後如下圖(下圖為EXCEL 2007 表示也能用)




作者提供以下範例可直接複製並執行


proc sql; * Create some sample data;
create table prod1993 as
select product, month as monum, put(month,monname3.) as month, sum(actual) as actual
from sashelp.prdsale(where=(year=1993)) group by 1, 2, 3 order by 1, 2;
%chart(workbook, name=c:\temp\chart.xls);
%chart(worksheet, name=TestBar); * Example #1 – Three-Across Bar Charts;
%chart(chart, charttype=bar, cell=b2, across=3, data=prod1993, catvar=product, xvar=month,
yvar=actual, yFormat="#,##0", ymax=10000, yint=2000);
%chart(worksheet, name=TestLine); * Example #2 – One-Across Line Charts;
%chart(chart, charttype=line, cell=a1, across=1, data=prod1993, catvar=product, xvar=month,
yvar=actual, yFormat="#,##0", ymax=10000, yint=2000);
%chart(worksheet, name=TestBoth); * Example #3 – Three-Across Bar and Line Charts;
%chart(chart, charttype=bar, cell=a1, across=3, data=prod1993, catvar=product, xvar=month,
yvar=actual, yFormat="#,##0", ymax=10000, yint=2000);
%chart(chart, charttype=line, cell=a40, across=3, data=prod1993, catvar=product, xvar=month,
yvar=actual, yFormat="#,##0", ymax=10000, yint=2000);
%chart(create);





3.再將VBA語言表現在EXCEL資料表上並繪製出圖檔


以下為MACRO執行後在EXCEL內實現的VBA程式碼,僅供參考


Set XL = CreateObject("Excel.Application")
XL.Visible=True
XL.Workbooks.add
XL.ActiveWorkbook.SaveAs "c:\temp\chart.xls", -4143
XL.Sheets.Add.name = "TestBar"
XL.ActiveSheet.PageSetup.CenterHorizontally = True
XL.ActiveSheet.PageSetup.CenterVertically = True
XL.ActiveSheet.PageSetup.Orientation = 2
XL.ActiveSheet.PageSetup.FitToPagesWide = 1
XL.ActiveSheet.PageSetup.FitToPagesTall = 1
XL.ActiveSheet.PageSetup.Zoom = False
XL.windows("chart.xls").Activate
XL.Range("A1").Select
XL.Charts.Add
XL.activechart.ChartType = 51
XL.activechart.SeriesCollection.NewSeries
XL.activechart.SeriesCollection(1).XValues = "={""Jan"",""Feb"",""Mar"",""Apr"",""May"",""Jun"",""Jul"",""Aug"",""Sep"",""Oct"",""Nov"",""Dec""}"
XL.activechart.SeriesCollection(1).Values = "={4085, 5025, 4918, 6999, 5727, 7615, 8189, 5754, 4038, 5284, 4890, 6939}"
XL.activechart.SeriesCollection(1).Name = "=""BED"""
XL.activechart.Location 2, "TestBar"
XL.activechart.Axes(1).MajorTickMark = -4142
XL.activechart.Axes(1).MinorTickMark = -4142
XL.activechart.Axes(2).MajorTickMark = -4142
XL.activechart.Axes(2).MinorTickMark = -4142
XL.activechart.Axes(2).MinimumScale = 0
XL.activechart.Axes(2).MaximumScale = 10000
XL.activechart.Axes(2).MinorUnit = 2000
XL.activechart.Axes(2).MajorUnit = 2000
XL.activechart.Axes(2).TickLabels.NumberFormat ="#,##0"
x = XL.worksheets("TestBar").ChartObjects(XL.worksheets("TestBar").ChartObjects.Count).Left
XL.worksheets("TestBar").ChartObjects(XL.worksheets("TestBar").ChartObjects.Count).Left =
XL.worksheets("TestBar").Columns(XL.range("b2").column).Left
XL.activechart.Legend.Delete
XL.worksheets("TestBar").ChartObjects(XL.worksheets("TestBar").ChartObjects.Count).Top =
XL.worksheets("TestBar").Rows(XL.range("b2").row).Top


2008年1月2日 星期三

利用Libname匯入excel資料

原文出處:http://www2.sas.com/proceedings/sugi31/020-31.pdf



對於外部資料如excel要匯入SAS很麻煩嗎~~
一般來說不是利用SAS的proc import語法就是利用SAS的匯入選單,但有很多個檔案怎麼辦呢,上述SUGI技術文件ED heaton, Westat作者提供另外說明方便使用者在EXCEL匯入的方面語法

首先 先建立libname檔案,並且將該路徑資料夾中excel檔打上完整檔名,如file.xls

libname test "\\路徑資料夾\file.xls";


匯入後,就會在SAS的explorer裡面看到該test資料櫃,並在裡面看到file的excel檔案,並會有該檔案的所有可能分頁
下圖為excel檔案,欲匯入SAS程式內,其中有3個分頁sheet1,sheet2,sheet3


利用libname 匯入後,在SAS的explorer所呈現如下圖



打開該分頁檔案後,初步的excel匯入就大功告成了


但怎麼引用該資料檔呢? 在使用不同資料櫃資料檔時都必須先打上該資料櫃名稱,如test.file,或是SAS預設值work.file
而要引用剛剛匯入的excel檔的話則是將後面該資料檔名做個符號"filename"n包括起來,如下

test."Sheet1$"n;


例如想把剛剛匯入的excel做簡單的列印可寫為下述

Proc print data=test."Sheet1$"n Label;
Run;


如下圖





對於excel匯入資料後若excel檔案中第一行為變項名稱時(特別是非英文命名時),SAS都會將其轉為SAS檔中的標籤部分Label,但對於使用者來說若不想要這樣的檔案名稱,可將其抹除(有一點風險在,就是每個變項命名使用者必須自行記憶,所以若在excel檔第一行皆以英文命名時SAS會直接引用到變項部分(name))
所以可以在libname語法後接上dbSasLabel=none,之後檔案就不會在包含標籤部分Label了

libname test "\\路徑資料夾\file.xls" dbSasLabel=none;






而若是excel檔的第一行並非是變項名稱,而是直接為資料部分,所以可以在libname語法後接上header=no,不過使用時要注意第一行確實為資料,否則該資料若為數字型態該第一行會變成Missing Data

libname test "\\路徑資料夾\file.xls" header=no;


如下圖為excel第一行為資料

匯入SAS後如下

若匯入的資料第一行是為變項時,接上header=no此語法會有錯誤出現,如下圖

第一行為變項,被判讀為該變項的資料,之後造成格式錯誤,故使用請小心




然而若excel資料屬性複雜(excel的通病,會有通用格式這種含糊不清的變項屬性)時
如下圖

所以在匯入SAS時會有錯誤出現,例如匯入後列表出來

libname test "C:\.........\demo.xls" ;

Proc print data=test."Sheet1$"n label;
Run ;



如下圖

文字變項中錯誤格式則顯示為空白(文字型的遺漏值(Missing value)),而數字型態的錯誤格式則顯示為一個點"."(數字型態的遺漏值)

而要解決這樣的問題時,其實可以將有含混不清的變項都視為文字型態
故可加入此語法mixed=yes,如下

libname test "C:\.........\demo.xls" mixed=yes ;

Proc print data=test."Sheet1$"n label;
Run ;




完成如下圖,在此可以先習慣一下資料屬性簡易辨別,文字型資料在SAS或excel都是在格子內站左邊,數字型站右邊,所以下圖性別和年齡都是文字格式了




以下為進階用法,請自行斟酌使用




而如要簡略修改某變項屬性格式時可試著引用(dbSASType=("name"="char(n)"))


Proc print data=test."Sheet1$"n(dbSASType=("name"="char(1)"));
Run ;


其中"name"為需要更改的變項標籤(Label),如"性別"
而後面在加上"char(1)",其中的數字為文字屬性char字元長度為1,
而也可以改n字元長度(n自定數字)

此可用在任一引用資料後,例如

data test;
set work.data(dbSASType=("name"="char(1)"));,
Run ;

或是

proc print data=work.data(dbSASType=("name"="char(1)"));,
Run ;




不過也可以將"char(n)"改為"NUMBERIC"或是"DATETIME","DATE","TIME"等

注意使用上述語法必須小心,特別是轉為數字型態"NUMBERIC"這類時容易有錯亂情形(雖然被宣告為文字型態但想轉回數字時該變項含有其他非數字的觀察值)
若想將變項宣告為數字型態時可改為以下寫法,才能讓數字中有文字的轉為遺漏值"."

如下為excel檔


寫入以下語法後將資料含有文字的變項皆轉為文字型態

libname xls "C:\.................\demo.xls" mixed=yes;
proc print data=xls."sheet1$"n label;
run;



SAS匯入資料如下圖(身高變項為_col2 體重變項為_col3)


欲將身高變項(_col2)與體重變項(_col3)再次轉回數字型態,並不考慮觀察值內的其他資料如M,S這些文字,而是一率都看成遺漏值"."
可在引用資料時另增新變項來求得該變項轉為數字型態的變換

data test;
set xls."sheet1$"n ;
x = input( _col2 , best. ) ;
y = input( _col3 , best. ) ;
proc print;
Run ;


其中x來自身高變項(_col2)的轉換,其格式為SAS best12.的數字型態
y來自體重變項(_col3)的轉換,其格式也為SAS best12.的數字型態
列出後如下圖






此外excel檔通常也能支援日期格式的資料,固然匯入SAS時也是一大挑戰
如下圖為三種日期格式,1.原文提供之日期變數2.為時間變數3.為日期與時間混合變數
4.為excel中可接受的日期格式5.為excel中定義的日期變數


若將其直接讀入時,1,2,3個變項因為定義都只視為文字型態變項,但4,5因有excel的定義所以讀入SAS的格式能夠確實轉為時間格式date.


但1,2,3個變像是為時間格式但要如何匯入SAS呢?可打上此語法stringDates=yes,不過若是使用excel日期格式時皆會被轉回文字型態

libname xls "C:\.................\demo.xls" mixed=yes stringDates=yes;
proc print data=xls."sheet1$"n label;
run;


匯入後如下圖,時間變項皆被轉為文字型態


若要1,2,3確實轉為時間格式還是要使用者確實了解SAS時間格式的設定方法才能正確引用
而可以將時間先轉為SAS內建的時間(1960年1月1日起始),以日為單位,之後再行應用

data test;
set xls."sheet1$"n ;
x1 = input( DateVar , mmddyy10. ) ;
x2 = input( TimeVar , hhmmss. ) ;
proc print;
Run ;





對於時間格式的變換有興趣可自行參閱SAS說明或是相關工具書

Libname

利用Libname匯入excel資料

建立外部資料庫連線-以MS資料庫為例