2017-02-14 3 views
4

у меня есть набор данных, где каждый случай имеет следующий набор переменных:SPSS: DO REPEAT с различным числом соответствующих переменных

VarA1.1 к VarA25.185 (в общей сложности 4625 переменных) VarB.1 к VarB .185 (всего 185 переменных)

Для каждого случая VarA1.1, VarA2.1, VarA3.1 и т. Д. Все связаны с одним и тем же VarB.1.

Я хочу использовать функцию REPEAT для поиска по каждому экземпляру .1, используя как VarA, так и VarB.

Пример кода:

DO REPEAT VarA = VarA1.1 to VarA25.185 
/VarB = VarB.1 to VarB.185. 
if (VarA = X) AND ((VarB-Y)<0) 
VarC = Z. 
END REPEAT. 
EXE. 

Тем не менее, кажется, что, поскольку существуют разные числа переменных в списке повторного Вара и VarB, они не пара вверх. Я хочу связать каждый VarA # (1-25) .1 с VarB.1, каждый VarA # (1-25) .2 с каждым VarB.2 и т. Д. До VarB.185, так что в функции повторения правильная используется спаривание переменных.

Спасибо!

ответ

4

Другой способ сделать это состоит в использовании LOOP снаружи и DO REPEAT на внутренней стороне. Так вот некоторые примеры данных, с помощью всего три переменных А, которые идут на 1 до 10.

SET SEED 10. 
INPUT PROGRAM. 
LOOP Id = 1 TO 100. 
END CASE. 
END LOOP. 
END FILE. 
END INPUT PROGRAM. 
DATASET NAME Sim. 

*Making random data. 
VECTOR A1.(10). 
VECTOR A2.(10). 
VECTOR A3.(10). 
VECTOR B.(10). 
NUMERIC X Y. 
DO REPEAT a = A1.1 TO Y. 
    COMPUTE a = RV.BERNOULLI(0.5). 
END REPEAT. 
EXECUTE. 

Так вот часть, которую вы хотите обратить внимание. Ваш DO REPEAT в настоящее время перебирает 25 переменных. Это переключает его, так что часть LOOP переходила через 25 переменных, но DO REPEAT просматривает каждый из ваших векторов.

VECTOR A1 = A1.1 TO A1.10. 
VECTOR A2 = A2.1 TO A2.10. 
VECTOR A3 = A3.1 TO A3.10. 
VECTOR B = B.1 TO B.10. 
VECTOR C.(10). 
LOOP #i = 1 TO 10. 
    DO REPEAT A = A1 A2 A3. 
    IF (A(#i) = X) AND (B(#i)-Y<0) C.(#i) = B(#i). 
    END REPEAT. 
END LOOP. 
EXECUTE. 

код гольф это, вероятно, не будет бить макро подход, так как вы должны определить все эти VECTOR заявления. Но я думаю, что это концептуально понятный способ написать программу.

+0

Уход! Никогда раньше не использовали комбинацию «LOOP»/'DO REPEAT'. Помимо необходимости выписывать все команды VECTOR, это будет работать очень хорошо. В частности, если у вас есть несколько или одна переменная 'A', как в вашем примере, и поэтому вам не нужно вникать в макроязык. –

+0

Удивительно, спасибо вам за ваши ответы! Как кто-то относительно новый для SPSS, я действительно ценю цикл/повторить подход, поскольку он имеет смысл концептуально. – ScienceStudent

3

Похоже, что вы пытаетесь сделать это через 25 переменных, но повторите это для 185 переменных.

Было бы более оперативно использовать код SPSS Macros для этого. Вышеупомянутое будет демонстрировать строительные блоки для решения вашей проблемы с данными.

DEFINE !MyMacroName() 
SET MPRINT ON. 
/* Generate some example data to match desired data format*/. 

set seed = 10. 
input program. 
loop #i = 1 to 50. 
compute case = #i. 
end case. 
end loop. 
end file. 
end input program. 
dataset name sim. 
execute. 

!do !i =1 !to 25 
    vector !concat('VarA',!i,'.(185, F1.0).'). 
    do repeat v = !concat('VarA',!i,'.1') to !concat('VarA',!i,'.185'). 
    compute v = TRUNC(RV.UNIFORM(1,6)). 
    end repeat. 
!doend 

vector VarB.(185, F1.0). 
do repeat v = VarB.1 to VarB.185. 
    compute v = TRUNC(RV.UNIFORM(1,6)). 
end repeat. 

execute. 

/* Solve actual problem */. 
!do !i =1 !to 185 
    !do !j = 1 !to 25 
    if (!concat('VarA',!j,'.',!i) = !concat('VarB.',!i)) !concat('VarC', !j)=1. 
    !doend 
!doend 

SET MPRINT OFF. 
!ENDDEFINE. 

/* Run macro */. 
!MyMacroName. 
Смежные вопросы