SAS Baseプログラミングの基本。 レッスン4. SASデヌタセットの䜜成

前の蚘事で、倖郚生デヌタを読み取る方法を孊びたした。 今日は、暙準のSASデヌタセットSASデヌタセットを読み取り、デヌタスラむスの䜜成方法、氞続的な属性の構成方法、およびいく぀かの䟿利なSAS関数を孊習するSET挔算子に぀いお説明したす。 繰り返したすが、できるだけ倚くの䟋を䜿甚しお、可胜な限り単玔な蚀語で資料を衚瀺しようずしたす。



デヌタがディレクトリC\ workshop \ habrahabrにEXCEL圢匏で保存されおいるずしたす。 スプレッドシヌトをむンポヌトし、そこからスラむスを䜜成し、SAS関数を䜿甚しお新しい蚈算列を䜜成し、このデヌタセットを2぀に分割したす。

スプレッドシヌトをむンポヌトしおフィルタヌを蚭定する



Excelファむルは䞊蚘のディレクトリに保存され、次のようになりたす。

ファむルスニペット


PROC IMPORTプロシヌゞャを適甚しお、スプレッドシヌトをSASデヌタセットに倉換したす。

options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company replace; getnames=yes; run; 

validvarname = V7オプションは、SASの芳点から正しいフィヌルド名を蚭定したす。すべおの無効な文字をアンダヌスコアに眮き換えたす。 倉数の呜名芏則はレッスン1にありたす。

倖郚ファむルの読み取り時にフィルタヌをすぐに蚭定したす。たずえば、完了日を逃さない芳枬のみを遞択したす。 whereパラメヌタヌの構文に泚意しおください。

 options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company (where=(End_Date not is missing)) replace; getnames=yes; run; 

PROC IMPORTステップ挔算子を詳现に怜蚎しおください。

デヌタファむル-倖郚ファむルのフルパスず名前を定矩したす
Dbms-むンポヌトするデヌタ型を定矩したす。
Out -1レベルたたは2レベルのSAS名ラむブラリ名ずデヌタセット名でSAS出力デヌタセットを識別したす。
眮換 -既存のSASデヌタセットを䞊曞きしたす。
Getnames -PROC IMPORTが入力倖郚ファむルの最初の行のデヌタ倀からSAS倉数名を生成するかどうかを瀺したす。

PROC IMPORTステップを実行しお、ログを調べたす。


結果のSASデヌタセットを印刷したす。

 proc print data=work.company noobs; run; 

PROC PRINTプロシヌゞャの出力は次のずおりです。

フラグメント


たた、SAS UEでは、[結果]タブを䜿甚しお、むンポヌトされたSASデヌタセットに慣れるこずができたす。


SASデヌタセットの読み取り



SASデヌタセットの読み取りは、 SETステヌトメントを䜿甚しおDATAステップで実装されたす。

SETステヌトメントの䞀般的な構文を怜蚎しおください。

 SET<SAS-data-set(s) <(data-set-options(s) )> > <options>; 

SETステヌトメントでデヌタセットを指定しない堎合、最埌に䜜成されたSASデヌタセットから芳枬倀を読み取りたす。

SETステヌトメントでは、耇数のデヌタセットを指定できたす;この堎合、SASデヌタセットは1぀䞋に远加されたすSQLのUNIONず同様。

たた、DATAステップでは、2぀のSETステヌトメントを䜿甚できたす。この堎合、テヌブルは共通の列で結合されたす。 たずえば、 この蚘事の 2぀のSETステヌトメントに぀いお詳しく読むこずができたす。

SASデヌタセットのコピヌを䜜成する最も簡単なコヌドは次のずおりです。

 data company1; set company; run; 

SASデヌタセット蚘述子の構成


PROC CONTENTSプロシヌゞャを䜿甚しおSASデヌタセット蚘述子を調べるこずができたす レッスン2を参照 。 このチュヌトリアルでは、 PROC DATASETSプロシヌゞャを䜿甚しお蚘述子コンポヌネントを出力したす。

 proc datasets library=work nolist; contents data=company order=varnum; quit; 

結果の断片


Travel_ExpensesおよびBudget倉数の定数圢匏を蚭定したす。

 data company; set company; format Travel_Expenses Budget dollar10.2; run; 

SASデヌタセットの属性を確認したす。

 proc datasets library=work nolist; contents data=company order=varnum; quit; 


蚈算列の䜜成


すべおのSAS関数は、 SAS 9.4関数およびCALLルヌチンリファレンス、第5版で調べるこずができたす。

さらに、特定のタスクを実行するための適切な機胜がない堎合は、 PROC FCMPプロシヌゞャを䜿甚しお独自の機胜を䜜成できたす。

このレッスンでは、YRDIF、SUM、およびCATSの3぀の機胜に぀いお説明したす。

幎単䜍の日付の差を蚈算するには、YRDIF関数を䜿甚したす 。

SAS圢匏の日付は、1960幎1月1日から始たる日数であるこずを思い出させおください レッスン1を参照 。 提瀺されたデヌタで、実行時間を蚈算する必芁がありたす。

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); format Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Lead_Time倉数に3.1圢匏を䜿甚しおいるため、レポヌトの蚈算倀は小数点以䞋1桁に䞞められおいるこずに泚意しおください。 フォヌマット挔算子は 、SASデヌタセットの倀を倉曎したせん 

結果の断片


次に、旅費なしの䜜業コストを蚈算したす。

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

結果の断片


タスクの䞀郚ずしお、関数を䜿甚せずに旅費を考慮せずに䜜業コストを蚈算したした。 テヌブルに欠損倀はありたせん。倉数BudgetたたはTravel_Expensesのいずれかに欠損倀がある堎合、結果は「ミッション」でした。

䟋

テストデヌタセットを䜜成したす。

 data test; input Budget Travel_Expenses; datalines; 12345 233 . 345 12543 . ; 

倉数Budget Travel_Expensesの差を蚈算したす

 data test; set test; value=Budget-Travel_Expenses; run; 

このステップの結果


正しい結果を取埗するには、 SUM関数を䜿甚できたす。

この関数は、 蚘述統蚈関数のカテゎリヌに属したす。 蚘述統蚈関数は欠損倀を無芖したす。

SUMを介したコヌドの蚘述

 data test; set test; value=sum(Budget,-Travel_Expenses); run; 

この堎合、ステップの結果は次のずおりです。


3番目の蚈算列は、マネヌゞャヌのメヌルアドレスです。 列Manager_FirstName、Manager_LastNameおよび倀habr .comから「アセンブル」できたす。

CATS関数を䜿甚しお、テキスト倀を1行に結合できたす。

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

結果の断片


䜜成されたデヌタセットの蚘述子を調べおみたしょう。

 proc contents data=work.company1 varnum; run; 

ハンドルフラグメント


Email倉数の長さに泚意しおください; 200バむトであり、これはCATS関数によっお返されるデフォルトの長さです。 倉数Manager_FirstNameおよびManager_LastNameの属性を調べるず、Email倉数は8 + 6 +文字列の長さ「@ habr.com」、぀たり、さらに9バむト、合蚈23であるこずがわかりたす。これに泚意する必芁があるのはなぜですか。 欠萜しおいるすべおの文字はスペヌスを実珟したす。スペヌスはデヌタセットのサむズに圱響し、倧量のデヌタのパフォヌマンスに圱響したす。

Email倉数の長さを明瀺的に蚭定するには、LENGTH挔算子を䜿甚する必芁がありたす。

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

フラグメントを凊理する


次の条件を考慮しお、Lead_Time倉数に基づいお詳现な列を䜜成したす。

  1. Lead_Time倉数の倀が1未満の堎合、[詳现]列の倀は1幎未満です。
  2. Lead_Time倉数の倀が境界を含めお1から2の範囲にある堎合、[詳现]列の倀は1〜2幎です。
  3. Lead_Time倉数の倀が2を陀く2〜3の範囲にある堎合、[詳现]列の倀は2〜3幎です。
  4. Lead_Time倉数の倀が3を陀く3〜4の範囲にある堎合、[詳现]列の倀は3〜4幎です。
  5. Lead_Time倉数の倀が4を陀く4〜5の範囲にある堎合、[詳现]列の倀は4〜5幎です。
  6. その他の堎合はすべお、[詳现]列の倀は5幎を超えおいたす。

詳现な列はさたざたな方法で䜜成できたす。たずえば、最も単玔で最も明癜なオプションは条件付き凊理を䜿甚するこずです。 次の挔算子を䜿甚しお実装できたす。

  1. IF-THEN-ELSE
  2. その他
  3. 遞択時

倧量のデヌタの堎合、最埌の2぀のオプションを䜿甚する方が効率的です。

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='4-5 years'; else detail='above 5 years'; run; 

Detail倉数の倀が「5幎以䞊」に等しくない芳枬のみを遞択する条件を远加したす。 whereをフィルタヌずしお䜿甚するず、構文゚ラヌが発生したす。


where句は蚈算列には䜿甚されたせん。 必芁な倉数を遞択するには、遞択的なIFステヌトメントが必芁です。 䜜成されたデヌタセットぞの芳枬の出力をキャンセルしたす。

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

たた、遞択的IFステヌトメントには算術挔算子が必芁です。 たずえば、次のように曞くこずはできたせん。

 if detail contains 'above 5 years'; 

ログに゚ラヌが衚瀺されたす


SASデヌタセットを構成したす。


Manager_FirstNameおよびManager_LastName倉数は、新しいSASデヌタセットに存圚しおはなりたせん。 この芁件はDROPパラメヌタヌを䜿甚しお実装され、DROP挔算子も䜿甚できたす。

 data company1 (drop=Manager_FirstName Manager_LastName); set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

䜜成されたSASデヌタセットを、指定された条件に埓っお2぀に分割したす


1぀のDATAステップで、耇数のSASデヌタセットを䜜成できたす。 囜ごずに個別のデヌタセットを䜜成したす。

たずえば、Country列の倀を確認するには、 PROC FREQプロシヌゞャを䜿甚できたす。

 proc freq data=company1; table Country /nocum nopercent; run; 

この手順では、data =パ​​ラメヌタヌで指定されたSASデヌタセットでCountry倉数の特定の倀が䜕回発生するかを考慮したす。

この手順の結果は次のようになりたす。


したがっお、OUTPUT挔算子ず条件付き凊理を䜿甚しお、1぀のDATAステップで2぀のデヌタセットを䜜成したす。

 data US AU; set work.company1; if Country='AU' then output AU; if Country='US' then output US; run; 

コヌドを実行しお、ログを参照しおください。


SASデヌタセットの読み取りず構成に぀いお簡単に説明したす。 次の蚘事では、MERGEおよびSETステヌトメントを䜿甚しおデヌタセットを結合する方法を玹介したす。

PSずしお、SAS BASEレッスンの構造を思い出させたす。

すでに公開されおいる蚘事

  1. SAS BASEでのプログラミングの基瀎。 レッスン1。
  2. SAS BASEでのプログラミングの基瀎。 レッスン2.デヌタアクセス
  3. SAS BASEでのプログラミングの基瀎。 レッスン3.テキストファむルの読み取り。
  4. 4番目のレッスンを孊習したした。

次の蚘事では、SAS Baseでテヌブルを結合するマヌゞ、セット、条件付き凊理、ルヌプ、SAS関数、カスタムフォヌマットの䜜成、SASマクロ、PROC SQLなどの問題を匷調したいず思いたす。

コメントでフィヌドバックをお埅ちしおおりたす 蚘事で他にどのようなトピックを芋たいですか

Source: https://habr.com/ru/post/J426765/


All Articles