以下は、あなたがやろうとしていることの例です。ループとインデックスの使用を do repeat コマンドに置き換えたことに注意してください。私には、ループ内でリード インデックスを呼び出すのではなく、do repeat コマンドで 2 つのリストを作成することで、何をしているのかがより明確になります。
*making data.
DATA LIST FIXED /X1 to X4 1-4.
BEGIN DATA
1111
0101
1 0
END DATA.
*I make new variables, so you dont overwrite your original variables.
vector X_rec (4,F1.0).
do repeat X_rec = X_rec1 to X_rec4 / X = X1 to X4.
compute X_rec = X.
end repeat.
execute.
do repeat X_later = X_rec2 to X_rec4 / X_early = X1 to X3.
if missing(X_later) = 1 X_later = X_early.
end repeat.
execute.
これに関するいくつかの注意事項。以前は、コードが初期変数を上書きしていました。このコードでは、「X_rec1 ... X_rec4」という名前の新しい変数セットを作成し、それらの値を元の変数セット (X1 から X4) と同じに設定します。2 番目の do repeat コマンドは、前の変数で欠損値が発生した場合に、再コード化された変数を埋めます。これと以前のコードの大きな違いの 1 つは、以前のコードを繰り返し実行すると、欠落しているデータが引き続き入力されますが、私のコードではそうではありません。不足しているデータを引き続き入力したい場合は、上記のコードを次のように置き換えるだけですX_early = X1 to X3
。X_early = X_rec1 to X_rec3
次に、コードを少なくとも 3 回実行します (もちろん、4 つの変数のすべてのデータが欠落している場合でも、すべて欠落している可能性があります)。以下は、この繰り返されるコードの呼び出しを簡略化するためのマクロです。
SET MPRINT ON.
DEFINE !missing_update (list = !TOKENS(1)).
!LET !list_rec = !CONCAT(!list,"_rec")
!LET !list_rec1 = !CONCAT(!list_rec,"1")
!LET !list_rec2 = !CONCAT(!list_rec,"2")
!LET !list_rec4 = !CONCAT(!list_rec,"4")
!LET !list_1 = !CONCAT(!list,"1")
!LET !list_3 = !CONCAT(!list,"3")
!LET !list_4 = !CONCAT(!list,"4")
vector !list_rec (4,F1.0).
do repeat UpdatedVar = !list_rec1 to !list_rec4 / OldVar = !list_1 to !list_4.
compute UpdatedVar = OldVar.
end repeat.
execute.
do repeat UpdatedVar = !list_rec2 to !list_rec4 / OldVar = !list_1 to !list_3.
if missing(UpdatedVar) = 1 UpdatedVar = OldVar.
end repeat.
execute.
!ENDDEFINE.
*dropping recoded variables I made before.
match files file = *
/drop X_rec1 to X_rec4.
execute.
!missing_update list = X.
セットごとにマクロを繰り返し呼び出すことなく、データセット内のすべての変数をループする方法があると思いますが、その方法がわかりません (DEFINE 内では不可能な場合があり、 Python プログラムの作成に頼る必要があります)。最悪の場合、上記のマクロ定義関数を 400 回も書く必要があります。