1

第一次在论坛发帖!我是一个业余 sas 用户,具有非常基本的编程技能,可悲的是词汇量......

想法是这样的:对于单个观察,我有 6 个变量。让我们称它们为 Fonction1 到 6。

如果 Fonction1 为空,我希望 sas 将内容从 Fonction2 移动到 Fonction1,从 Fonction3 移动到 Fonction2,等等......直到它不再为空

那么如果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 回答