2016-08-29 13 views
0

私はdate1-date99のデータセットを持っていますが、観測ごとに欠損していない日付が最大で5つあります。私は不足していない日付を保持してdatenew1-datenew5に割り当てたいだけです。これを行うための最善の方法に関する提案。私は他のdoループ(i = 1〜5、j = 1〜99)の中でループをやっていると思っていましたが、最初の欠けていない日付がいったんあったら、次の値に移る最善の方法を覚えていませんでした発見されました。SAS:配列から欠損値を保持する

+0

では、新しいアレイ内の任意の特定の順序であることを非欠落している日付は必要ですか? – user667489

+0

はい、元のデータのままにするための注文が必要です。たとえば、元の:date1 = 1Jan1980、date2 =。、date3 = 5Feb1980、新しいデータセットにdatenew1 = 1Jan1980、datenew2 = 5Feb1980を設定します。ありがとう。 –

+0

元のデータセットの日付は昇順になっていますか? – user667489

答えて

0

私は、これはそれをしないと思う:

data have; 
informat total_nonmissing; 
do j = 1 to 1000; /*Number of rows to output*/ 
    array date[99]; 
    chosen = 0; 
    remaining = dim(date); 
    do i = 1 to remaining; 
     call missing(date[i]); 
     if ranuni(2) < (5-chosen)/remaining then do; 
      date[i] = round(ranuni(1)*10000); 
      chosen + 1; 
      remaining + (-1);    
     end; 
    end; 
    total_nonmissing = n(of date{*}); 
    format date: yymmdd10.; 
    output; 
    drop i j chosen remaining; 
end; 
run; 

data want; 
    set have; 
    array newdate[5]; 
    array date[99]; 
    j = 1; 
    do i = 1 to dim(date); 
     if not(missing(date[i])) then do; 
      newdate[j] = date[i]; 
      j + 1; 
     end; 
    end; 
    format newdate: yymmdd10.; 
    keep newdate:; 
run; 
+0

ありがとう、user667489。これは完全に機能しました! –

+0

SAS doループの優れた機能の1つは、複合条件があることです。したがって、doループを次のように変更して配列のインデックスエラーを防ぐことができます。 'do i = 1〜dim(date)while(j <= dim(newdate));'これはNEWDATE配列が埋められた日付を探すのを止めるでしょう。 – Tom

関連する問題