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

すべてのアカウント番号を 1 つの行に配置し、値を上書きして、次のようにしたいと考えています。

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

by ステートメントが役立つと思いましたが、違います

4

3 に答える 3

0

このようなものがうまくいくはずです。last.account_number の場合は出力し、retain を使用して行全体で値を保持します。合体を使用して、欠落していない場合はゼロに設定します。いくつかの方法でそれを行うことができます。

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;
于 2013-10-16T17:55:07.343 に答える
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 ;
于 2014-09-04T09:44:22.853 に答える