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 命令中创建两个列表而不是在循环中调用前导索引更清楚你在做什么。

*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 X3X_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 次!

于 2011-07-14T15:56:48.010 回答
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.
于 2014-07-03T17:35:15.447 回答