Ниже приведен пример того, что, как мне кажется, вы пытаетесь сделать. Заметьте, я заменил использование циклов и индекса командой 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 раз!