2011-07-14 14 views
0

我是SPSS宏的新手,但我想我需要一个。做一个由4个变量组成的预定义循环100次

我有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. 
+1

您应该删除你的[重复提问](http://stackoverflow.com/q/6694046/604456)。 –

回答

1

下面是我想要做的一个例子。注意,我用do do命令取代了循环和索引的使用。对我来说,通过在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)相同。如果前一个变量出现缺失值,则第二个重复命令将填充重新编码的变量。这和你以前的代码之间有一个很大的区别,如果你反复运行它,它会继续填充缺失的数据,而我的代码不会。如果你想继续填写缺失的数据,你只需要在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. 您的循环语法不正确,因为当#index达到“4”时,您的代码表示您想对TEQ5DBv(5)执行操作。所以你肯定会得到一个错误。

我不知道你想要做什么,但是嵌套循环可能会帮助你实现目标。

下面是一个例子:

* 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. 
相关问题