Сделать предопределенный цикл, состоящий из 4 переменных 100 раз - PullRequest
0 голосов
/ 14 июля 2011

Я довольно новичок в макросах 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.

Ответы [ 2 ]

1 голос
/ 03 июля 2014
  1. Ваш Loop-синтаксис неверен, потому что, когда #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.
1 голос
/ 14 июля 2011

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

...