下面是我想要做的一个例子。注意,我用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次!
您应该删除你的[重复提问](http://stackoverflow.com/q/6694046/604456)。 –