2013-07-20 80 views
1

論壇上的第一篇文章!我是一個非常基本的編程技能,業餘sas用戶和詞彙可悲...SAS:如果Var1爲空,如何將單元格內容從Var2移動到Var1

這裏的想法:對於單一的觀察,我有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; 

但它不幹活g ...不知道爲什麼...(我很想知道雖然!)

有什麼建議嗎?

+0

作爲您的原始代碼的評論:這裏不需要單獨的datasteps。你可以在一個單獨的數據庫中完成所有這些工作 - 只要刪除「運行」,「數據」和「設置」語句就可以在這裏完成同樣的事情。我不確定你的n + 1真的在做什麼,或者爲什麼n <8在每個陳述上;你基本上有7次遍歷它,但是你沒有7次迭代。 – Joe

回答

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; 
相關問題