web-dev-qa-db-ja.com

SASでデータセット内の観測数(またはそれが空の場合)を検出する方法は?

データセットが空であるかどうか、つまり観測されていないかどうかを検出する方法はあるのでしょうか。または別の言い回しでは、特定のデータセットの観測数を取得する方法。

そのため、条件を設定するためのIfステートメントを記述できます。

ありがとう。

18
mj023119

PROC SQLを使用すると簡単です。カウントして、結果をマクロ変数に入れます。

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;
18

さまざまな方法がたくさんありますが、私はopen()およびattrn()でマクロ関数を使用する傾向があります。以下は、ほとんどの場合にうまく機能する簡単な例です。データビューを処理する場合や、レコードセットに削除のマークが付けられている場合や、where句がアクティブな場合など、より複雑な状況では、より堅牢なロジックが必要になることがあります。

%macro nobs(ds);
    %let DSID=%sysfunc(OPEN(&ds.,IN));
    %let NOBS=%sysfunc(ATTRN(&DSID,NOBS));
    %let RC=%sysfunc(CLOSE(&DSID));
    &NOBS
%mend;

/* Here is an example */
%put %nobs(sashelp.class);
14
cmjohns

@cmjohnsが話していたより完全な例を次に示します。空の場合は0が返され、欠落している場合は-1が返され、削除された観測とwhere句を処理するオプションがあります(where句を使用すると、非常に大きなデータセットでマクロに長時間かかる可能性があります)。

使用上の注意:

このマクロは、データセット内の観測数を返します。データセットが存在しない場合は、-1が返されます。これをODBC libnamesで使用することはお勧めしません。SASテーブルに対してのみ使用してください。

パラメーター:

  • iD-libname.dataset確認したいこと。
  • iWhereClause(Optional)-適用するwhere句
  • iNobsType(オプション)-NOBS OR NLOBSFSASV9ドキュメント のいずれか=説明のため。

マクロ定義:

%macro nobs(iDs=, iWhereClause=1, iNobsType=nlobsf, iVerbose=1);
  %local dsid nObs rc;

  %if "&iWhereClause" eq "1" %then %do;
    %let dsID = %sysfunc(open(&iDs));
  %end;
  %else %do;
    %let dsID = %sysfunc(open(&iDs(where=(&iWhereClause))));
  %end;

  %if &dsID %then %do;
    %let nObs = %sysfunc(attrn(&dsID,nlobsf));
    %let rc   = %sysfunc(close(&dsID));
  %end;
  %else %do;
    %if &iVerbose %then %do;
      %put WARNING: MACRO.NOBS.SAS: %sysfunc(sysmsg());      
    %end;
    %let nObs  = -1;
  %end;
  &nObs
%mend;

使用例:

%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);

結果

19
12
-1

インストール

SAS自動呼び出しライブラリ を設定し、このマクロを自動呼び出しの場所に配置することをお勧めします。

8
Robert Penridge

大きなデータセットがある場合、Proc sqlは効率的ではありません。 ATTRNを使用することは良い方法ですが、これはベースsas内で実行できますが、1行を読み取るだけで数十億行のobsの数を提供できる効率的なソリューションは次のとおりです。

data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;
3
Altumish

私はすでに多くの答えでここで車輪を再発明しようとしていると思います。しかし、実際のデータセットから数えようとする他のいくつかの方法が見られます-巨大なデータセットの場合、これには長い時間がかかる可能性があります。以下はより効率的な方法です。

proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;
1
enautic

トリックは、データセットが空の場合でも出力を生成することです。

data CountObs;

    i=1;
    set Dataset_to_Evaluate point=i nobs=j; * 'point' avoids review of full dataset*;
    No_of_obs=j;
    output;  * Produces a value before "stop" interrupts processing *;
    stop;   * Needed whenever 'point' is used *;
    keep No_of_obs;
run;

proc print data=CountObs;
run;

上記のコードは、データセットが空の場合でも観測数を生成するために見つけた最も簡単な方法です。 NOBSは扱いにくいかもしれないと聞きましたが、上記は単純なアプリケーションで機能します。

1
HandsomeDude

少し異なるアプローチ:

proc contents data=library.dataset out=nobs;
run;

proc summary data=nobs nway;
class nobs;
var delobs;
output out=nobs_summ sum=;
run;

これにより、観測値が1つのデータセットが得られます。変数nobsには、たとえデータが0であっても、データセット内の観測数の値があります。

1
Rory Wilsher