以下是您尝试执行的操作的示例。注意我用 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 次!