2015-04-28 4 views
4

мне нужно запустить ниже в SPSS:SPSS макрокоманды

if (event_duration = 0) Acti_Activity = Activity. 
if (event_duration = 1) Acti_Activity = MEAN (Activity, Activity_1). 
if (event_duration = 2) Acti_Activity = MEAN (Activity, Activity_1, Activity_2). 

... весь путь до ...

if (event_duration = 120) Acti_Activity = MEAN 
(Activity, Activity_1, Activity_2, Activity_3, Activity_4, Activity_5, Activity_6, Activity_7, Activity_8, Activity_9, Activity_10, 
Activity_11, Activity_12, Activity_13, Activity_14, Activity_15, Activity_16, Activity_17, Activity_18, Activity_19..... ,Activity_120 

Так по существу, мне нужен макрос «Если event_duration = X, Средние значения Activity до Activity_X ".

Я должен сделать это более чем 15 переменных, поэтому, хотя я могу напечатать их все, я предполагаю, что есть какой-то код, который упростит его?

ответ

4

Вот демонстрационный пример того, как обернуть это в макрос SPSS DEFINE-!ENDDEFINE, я параметризировал N = 120, но вы могли бы точно также параметризовать для 15 различных переменных, которые нужно запустить для этого. Я оставлю это вам, чтобы адаптироваться.

define !RunJob(n=!cmdend) 

!do !i = 0 !to !n 
    !if (!i=0) !then 
     do if (event_duration = !i). 
      compute Acti_Activity =Acti_Activity. 
    !ifend 
    !if (!i>0) !then 
     else if (event_duration = !i). 
      compute Acti_Activity =MEAN(Acti_Activity to !concat("Acti_Activity_",!i)). 
    !ifend 

!doend 
end if.  

!enddefine. 

set mprint on. 
!RunJob n=120. 

Если по какой-либо причине ваши переменные не в прилежащей порядке, или сказать Activity_15 не существует в данных, то этот подход должен дать сбой и останавливается при обнаружении ошибки. Если это так, то вы можете захотеть приблизиться к этому с помощью Python Programmability, которая в таких случаях намного более динамична и гибка.

+0

Я обновил свое сообщение, чтобы использовать DO IF вместо IF для проверки логического состояния, поскольку это будет быстрее, чем повторное тестирование IF условно для всех случаев каждый раз. –

+0

Похоже, что вам не хватает инструкции «ELSE IF», вложенной ниже макроса макроса «! Else». Также можно также упомянуть, когда вы даете ответы на людей в [нескольких местах] (http://spssx-discussion.1045642.n5.nabble.com/Simplifying-syntax-td5729393.html), поэтому никто не дублирует уже предпринятые усилия. –

+0

Спасибо Энди. Я его кодировал так, что он неоднократно оценивал DO IF/END IF, а не на первой итерации DO IF, а затем ELSE IF после этого. Я обновил сообщение. –

0

Мне было интересно. Когда event_duration равно 0, означает, что переменные Activity_1 через Activity_119 равны нулю, а когда event_duration равно 1, это означает, что Activity_2 через Activity_119 равно нулю и т. Д., Вы также можете использовать что-то более простое, как это.

compute Acti_Activity = SUM(Activity to Activity119)/(event_duration + 1). 
execute. 
+0

Закрыть! Очень близко! Но это не сработает, потому что, скажем, например, когда Event_Duration = 2 вы хотите суммировать только Activity1 и Activity2 и NOT, как в вашем случае Activity1 - Activity119? Ваш метод будет работать, если Event_Duration = 2, тогда только Activity1 и Activity2 имеют действительные данные и отсутствуют для всех других переменных активности, поэтому зависит от качества и структуры данных. –

Смежные вопросы