0

私は SPSS マクロではかなり新しいですが、必要だと思います。

私は 400 個の変数を持っています。このループを 400 回実行したいと考えています。私の変数は連続して並べられています。したがって、最初に変数 1 から 4 に対して、次に変数 5 から 8 に対して、次に変数 9 から 12 に対して、というようにこのループを実行したいと考えています。

vector TEQ5DBv=T0EQ5DNL to T4EQ5DNL.
loop #index = 1 to 4. 
+ IF( MISSING(TEQ5DBv(#index+1))) TEQ5DBv(#index+1) = TEQ5DBv(#index) . 
end loop. 
EXECUTE.
4

2 に答える 2

1

以下は、あなたがやろうとしていることの例です。ループとインデックスの使用を 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 X3X_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 回も書く必要があります。

于 2011-07-14T15:56:48.010 に答える