0

約 30 の変数 (列) を持つ約 5,000 万レコードのデータ セットがあります。変数ごとにデータセットをランク付けする必要があります。

この大規模なデータセットには大量のメモリが必要なため、プロシージャ ランクは機能しません。

ランクを手動で指定するには、それぞれの変数列でデータセットを並べ替えてから、数式を使用してランクを指定する必要があります。しかし問題は、データセットを 30 個の変数で 30 回ソートする必要があることです。これには非常に長い時間がかかり、実現不可能です。

この場合、どのような代替手段を使用できますか?

4

3 に答える 3

0

多くの選択肢がなく、あなたは厳しい立場にいます。毎回 30 個の変数すべてを並べ替えて保持すると、処理時間が大幅に増加します。私があなたなら、ランク付けしたい変数と数式を適用するためのシーケンス番号だけを保持し、最後にすべてをマージします。これには、データセット内の各変数をループしてから、すべてをマージする必要があります。以下の例を参照して、処理時間を短縮するのに役立つかどうかを確認してください。

** PUT ALL VARIABLES INTO LIST **;
PROC SQL NOPRINT;
    SELECT DISTINCT(NAME)
    INTO :VARS SEPARATED BY " "
    FROM DICTIONARY.COLUMNS
    WHERE LIBNAME = 'SASHELP' AND MEMNAME = 'FISH';
QUIT;

%PUT &VARS.;

** CREATE SEQUENCE NUMBER IN FULL DATA **;
DATA FISH; SET SASHELP.FISH; 
    SEQ=_N_;
RUN;

** LOOP OVER EACH VARIABLE TO ONLY PROCESS THAT VARIABLE AND SEQUENCE -- REDUCES PROCESSING TIME **;
%MACRO LOOP_OVER(VARS);
    %DO I=1 %TO %SYSFUNC(COUNTW(&VARS.));
        %LET VAR = %SCAN(&VARS,&I.);
        DATA FISH_&I.; SET FISH (KEEP=SEQ &VAR.);
        RUN;

        /* INSERT YOUR FORMULA CODE HERE ON FISH_&I. DATA (MINE IS AN EXAMPLE) */
        PROC SORT DATA = FISH_&I.;  
            BY &VAR.;
        RUN;

        DATA FISH1_&I.; SET FISH_&I.;
            BY &VAR.;
            RANK_&VAR = _N_;
        RUN;

        /* RESORT FINAL DATA BY SEQUENCE NUMBER VARIABLE */
        PROC SORT DATA = FISH1_&I.;
            BY SEQ;
        RUN;
    %END;
%MEND;

%LOOP_OVER(&VARS.);

** MERGE ALL SUBSETS BACK TOGETHER BY THE ORIGINAL SEQUENCE NUMBER **;
DATA FINAL;
    MERGE FISH1_:;
    BY SEQ;
    DROP SEQ;
RUN;
于 2016-10-27T13:31:40.307 に答える