1

フォーラムに初投稿!私は非常に基本的なプログラミング スキルと悲しいことに語彙を持つアマチュア sas ユーザーです...

アイデアは次のとおりです。1 つの観測に対して、6 つの変数があります。それらをFonction1から6と呼びましょう。

Fonction1 が空の場合、Fonction2 から Fonction1 に、Fonction3 から Fonction2 に、というように、空でなくなるまで、sas にコンテンツを移動させたいと思います。

次に、Fonction2 が空の場合も同様です。

のようなもの

観測 1: 9、9、空白、空白、5、4 は観測 1 になります: 9、9、5、4、空白、空白

観測全体が空になる可能性があり、それで問題ないことに注意してください

そこで、次のコードを書きました。

    data individus_fct; 
    set individus_fct;
    do while (Fonction1 = '' and n<8);
        put n=;
        n+1;
        Fonction1 = Fonction2;
        Fonction2 = Fonction3;
        Fonction3 = Fonction4;
        Fonction4 = Fonction5;
        Fonction5 = Fonction6;
        Fonction6 = '';
    end;
    run;
data individus_fct; 
set individus_fct;
    do while (Fonction2 = '' and n<8);
        put n=;
        n+1;
        Fonction2 = Fonction3;
        Fonction3 = Fonction4;
        Fonction4 = Fonction5;
        Fonction5 = Fonction6;
        Fonction6 = '';
    end;
    run;
data individus_fct; 
set individus_fct;
    do while (Fonction3 = '' and n<8);
        put n=;
        n+1;
        Fonction3 = Fonction4;
        Fonction4 = Fonction5;
        Fonction5 = Fonction6;
        Fonction6 = '';
    end;
    run;
data individus_fct; 
set individus_fct;
    do while (Fonction4 = '' and n<8);
        put n=;
        n+1;
        Fonction4 = Fonction5;
        Fonction5 = Fonction6;
        Fonction6 = '';
    end;
    run;
data individus_fct; 
set individus_fct;
    do while (Fonction5 = '' and n<8);
        put n=;
        n+1;
        Fonction5 = Fonction6;
        Fonction6 = '';
    end;
    run;

しかし、それは機能していません...理由はわかりません...(でも知りたいです!)

助言がありますか?

4

1 に答える 1

4

ここでの基本的な概念は、二重の配列トラバーサルです。これは最速の唯一の方法ではありませんが、わずかに高速なオプションよりもはるかに簡単です。

data have;      *creating some random data;
array fonction[6];
do _t = 1 to 20;
do x = 1 to 6;
  if ranuni(7) < 0.7 then fonction[x]=x;  *70% chance we get a value;
end;
output;
call missing(of fonction:);          *clear out array for next time;
end;
run;

data want;
set have;
array vars fonction1-fonction6; *vars can be any name;
do _item = 1 to dim(vars); *_item is iterator, dim(vars) is count of items in vars array;
  _counter=_item+1;
  do while (missing(vars[_item]) and _counter le dim(vars)); *repeat until you get a nonmissing or you hit the last item of the array;
    vars[_item] = vars[_counter];  *make current value equal to the next value;
    vars[_counter]=.;      *set the next value to missing - it will be fixed later;
    _counter=_counter+1;   *increment iterator, or you have infinite loops!;
  end;
  if _counter > dim(vars) then leave;  *if we got to the end early, then we are done here;
end;
run;
于 2013-07-20T23:55:38.483 に答える