做一个由4个变量组成的预定义循环100次

时间:2011-07-14 13:16:23

标签: spss

我是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.

2 个答案:

答案 0 :(得分:1)

以下是您尝试做的一个示例。注意我用do repeat命令替换了你对循环和索引的使用。对我来说,通过在do repeat命令中创建两个列表而不是在循环中调用前导索引来更清楚你正在做什么。

*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)相同。如果前一个变量出现缺失值,则第二个do repeat命令将填充重新编码的变量。这个和你之前的代码之间有一个很大的区别,如果你重复运行它在你以前的代码中会继续填写缺少的数据,而我的代码却不会。如果您想继续填写缺失的数据,您只需要将X_early = X1 to X3上面的代码替换为X_early = X_rec1 to X_rec3,然后只运行代码至少3次(当然,如果您有对于四个变量的所有缺失数据的情况,它将仍然缺失。)下面是一个宏来简化调用这个重复的代码。

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次上面的宏定义函数!

答案 1 :(得分:1)

  1. 您的循环语法不正确,因为当#index达到" 4"你的代码说你想在TEQ5DBv(5)上做一个操作。所以你肯定会得到一个错误。
  2. 我不知道您想要做什么,但嵌套循环可能有助于您实现目标。

    以下是一个例子:

    * Creating some Data.
    DATA LIST FIXED /v1 to v12 1-12.
    BEGIN DATA
    1234    9012
     2 4 6 8 1 2
    1 3 5 7 9 1 
    12  56  90  
       456   012
    END DATA.
    
    * Vectorset of variables
    VECTOR vv = v1 TO v12.
    
    LOOP #i = 1 TO 12 BY 4.
       LOOP #j = 0 TO 2.     /* inner Loop runs only up to "2" so you wont exceed your inner block.
          IF(MISSING(vv(#i+#j+1))) vv(#i+#j+1) = vv(#i+#j).
       END LOOP.
    END LOOP.
    EXECUTE.