2013-10-16 76 views
0

我用下面的代碼,它完美的作品,得到下面的結果:總覆蓋現有數據

data No_int_weeksPaid; 
set no_internet4; 
keep account_number week0-week61; 
by account_number; 
array week{62} week0-week61; 
do i = 1 to 62; 
    if i > subscription_start and i <= (subscription_end+1) then 
    week{i} = weeks_paid ; 
    else 
    week{i} = 0; 
end; 
drop i; 
run; 

給了我這樣的事情:

Account# Week0 week1 week2 week3 week4 
1   0  1  1  1  1 
1   0  0  0  5  5 
2   1  1  1  1  1 
2   0  2  2  2  2 
2   0  0  0  4  4 

我想擁有所有帳號的上一行和覆蓋值,使我得到這樣的:

Account# Week0 week1 week2 week3 week4 
1   0  1  1  5  5 
2   1  2  2  4  4 

我由聖認爲前景會有所幫助,但不會

回答

0

像這樣的東西應該有效。如果last.account_number輸出,並使用retain來保持行間的值。如果不拒絕,我使用coalesce設置爲零,您可以使用幾種不同的方法。

data No_int_weeksPaid; 
set no_internet4; 
keep account_number week0-week61; 
retain week0-week61; **CHANGED** 
by account_number; 
array week{62} week0-week61; 
do i = 1 to 62; 
    if i > subscription_start and i <= (subscription_end+1) then 
    week{i} = weeks_paid ; 
    else 
    week{i} = coalesce(week[i],0); **CHANGED** 
end; 
drop i; 
if last.account_number then output; **CHANGED** 
run; 
+0

不,這不是它。我想合併給定帳號的所有行,以便每當它們開始時,周的值將覆蓋現有的值。對於accnt#1,第二行在第三週有5,並且從第一行覆蓋剩下的1。 – user2448666

+0

這從OP不清楚,對不起。 – Joe

0

假設我明白你想要做什麼,試試這個:

data have; 
    input Account Week0 week1 week2 week3 week4; 
datalines; 
1   0  1  1  1  1 
1   0  0  0  5  5 
2   1  1  1  1  1 
2   0  2  2  2  2 
2   0  0  0  4  4 
run; 

data want; 
    set have(rename=(Week0=oWeek0 Week1=oWeek1 Week2=oWeek2 
        Week3=oWeek3 Week4=oWeek4)); 
    by account; 

    retain Week0 Week1 Week2 Week3 Week4; 
    array new{*} Week0 Week1 Week2 Week3 Week4; 
    array old{*} oWeek0 oWeek1 oWeek2 oWeek3 oWeek4; 

    keep Account Week0 Week1 Week2 Week3 Week4; 

    if First.account then 
    do i=1 to dim(new); 
     new{i} = old{i}; 
     end; 

    else do i=1 to dim(new); 
    if old{i} ne 0 then new{i} = old{i}; 
    end; 

    if last.Account; 
run; 

唯一的「規則」我看到的是你的保留變量的最後一個非零值的願望。只要您的原始數據按照提供的順序排列,它應該可以工作。

0

如果你想把它當作一個proc sql,可能比較容易建立一個快速宏來完成你的迭代你:

%MACRO Week(W) ; 
    %DO N=1 %TO &W ; 
    max(Week&N) as Week&N, 
    %END ; 
    0 as _null_ 
%END ; 

proc sql ; 
    create table output as 
    select Account, %Week(61) 
    from No_int_weeksPaid 
    group by Account 
    ; 
quit ;