【问题标题】:Repeating SPSS macro for different parameter values针对不同的参数值重复 SPSS 宏
【发布时间】:2018-01-04 14:46:51
【问题描述】:

您好,我是 SPSS 宏的初学者。我想知道人们是否可以告诉我是否可以使用宏在 if 语句中包含参数,例如

DEFINE !calc_spells (procedure = !TOKENS(1)).

*** Get the file.

get file ='C:\Users\mycomputer\Documents\file.sav'.

compute proc=0.
do repeat a=op1a to op4b.

if any(substr(a,1,4), !procedure) proc=1.
end repeat.
execute.

select if proc=1.
execute.

string procedure(a4).
compute procedure=!procedure.

*** aggregate file.
aggregate outfile=* 
   /break year procedure
   /median_cost median_stay = median(cost_spell_total_net total_stay)
   /number_of_spells = n. 

save outfile=!path_output + !QUOTE(!CONCAT(!procedure, '_output.sav')).
!enddefine.

!calc_spells procedure = A021.
!calc_spells procedure = A024.

基本上我想知道是否可以针对不同的过程代码重复此宏,而不是每次运行时手动更改代码?似乎我的代码不起作用,因为我根本没有收到任何案例?

【问题讨论】:

  • 您的宏看起来不错,如果它没有给您预期的结果,则可能是宏中的语法问题。请发布您的数据样本,以便我们帮助查找错误。由于这是一个附加问题,您应该将其作为一个单独的问题发布。
  • @Ting Yang 你也可以使用set mprint=on. 这将在日志中打印调用宏产生的语法。正如 eli-k 指出的那样,从概念上讲,您想要实现的目标是可行的,但在某个地方存在与您的上下文细节有关的错误。
  • @Ting Yahng:为什么不使用if substr(a,1,4) = !procedure proc=1.?仅当您想与更大的可能值列表进行比较时,才应使用 any 函数。您只是在与!procedure进行比较
  • 感谢所有 cmets。有效。通过使用 mprint=on,我知道错误发生在哪里。通过在过程代码中添加引号实际上很容易解决,例如!calc_spells procedure = 'A021'。谢谢我有点傻,但它成功了。欢呼

标签: macros spss


【解决方案1】:

要让宏在procedure 的几个值上运行,您可以使用宏循环:

DEFINE !calc_spells (procedureList = !cmdend).

   !do !procedure !in (!procedureList)
      ...
       [your original macro content]
      ...
   !doend

!enddefine.

!calc_spells procedureList = A021 A024 A025 A026.

【讨论】:

  • 感谢 eli-l 的回答。我尝试了您建议的循环代码,但仍然无法正常工作。看起来问题出现在 if 语句中,因为没有选择任何值。 'if any(substr(a,1,4), !procedure) proc=1' 是因为在 if 语句中无法识别字符串变量吗?谢谢
  • 请参阅我上面的评论 - 请发布您的数据示例(您可以将其作为编辑添加到您的原始帖子中),以便我们更好地了解您的语法应该做什么以及它在哪里失败。上面的循环只是为了对不同的值重复宏,但当然不能修复宏
  • 也 - 调试宏首先尝试编写简单的语法,写入参数值而不是参数名称,看看是否有效。如果没有,您可以先调试语法,然后将其重新构建为宏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多