Macros SPSS中的条件处理

Macros SPSS中的条件处理,macros,conditional,spss,Macros,Conditional,Spss,我想有条件地处理基于活动数据集的语法块 在SPSS宏中,您可以使用!如果!IFEND宏命令。但是,据我所知,用户需要通过使用!LET命令(!LET!FLAG=1),或使用宏输入变量。这与我使用其他语言的经验大不相同,在其他语言中,我可以编写基于我使用的数据的分支逻辑的代码 假设有一个语法块,我只想在活动数据集中至少有2条记录时运行它。我可以使用聚合函数在数据集中创建一个等于记录数的变量,但我找不到一种方法使宏变量以可用的方式等于该值!如果条件允许。下面是我想做的一个非常简单的版本 COMPUTE

我想有条件地处理基于活动数据集的语法块

在SPSS宏中,您可以使用!如果!IFEND宏命令。但是,据我所知,用户需要通过使用!LET命令(!LET!FLAG=1),或使用宏输入变量。这与我使用其他语言的经验大不相同,在其他语言中,我可以编写基于我使用的数据的分支逻辑的代码

假设有一个语法块,我只想在活动数据集中至少有2条记录时运行它。我可以使用聚合函数在数据集中创建一个等于记录数的变量,但我找不到一种方法使宏变量以可用的方式等于该值!如果条件允许。下面是我想做的一个非常简单的版本

COMPUTE DUMMY=1.  

AGGREGATE  
 /OUTFILE = * MODE = ADDVARIABLES  
 /BREAK DUMMY  
 /NUMBER_OF_CASES = N.  

!LET !N_CASES = NUMBER_OF_CASES.  

!IF (!N_CASES > 1) !THEN  
 MEANS TABLES = VAR1 VAR2 VAR3.  
!IFEND

我所尝试的可能吗?提前感谢您的时间和考虑。

以下是一种将数据集中的值放入宏的方法,您可以在任何需要的地方使用它,包括在另一个宏中。 首先,我们将创建一个小数据集来重新创建您的示例:

data list free/var1 var2 var3.
begin data 
1 1 1 2 2 2 3 3 3 
end data.
* this will create the number of cases value:
AGGREGATE   /OUTFILE = * MODE = ADDVARIABLES   /BREAK  /NUMBER_OF_CASES = N.  
compute just_checking= !N_CASES .
现在,我们可以将值发送到宏中,方法是使用宏定义编写一个单独的语法文件

do if $casenum=1.
write out='SomePath\N_CASES.sps' /"define !N_CASES() ", NUMBER_OF_CASES, " !enddefine.".
end if.
exe.
insert file='SomePath\N_CASES.sps'.
宏现在已定义,您可以在计算中使用该值(例如,如果您想将其用于分析不同的数据集,或者在当前数据不可用时,在以后的语法中使用该值)。
例如:

data list free/var1 var2 var3.
begin data 
1 1 1 2 2 2 3 3 3 
end data.
* this will create the number of cases value:
AGGREGATE   /OUTFILE = * MODE = ADDVARIABLES   /BREAK  /NUMBER_OF_CASES = N.  
compute just_checking= !N_CASES .
您也可以在宏中使用它,如示例中所示-您将看到新宏无法读取
!N_CASES
宏原样,这就是为什么需要
!eval()
函数:

define !cond_means ()
   !IF (!eval(!N_CASES) > 1) !THEN  
       MEANS TABLES = VAR1 VAR2 VAR3.  
   !IFEND
!enddefine.
现在,如果数据中只有一行,则运行宏将不会产生任何结果;如果数据中有多行,则将运行宏意味着:

!cond_means.

非常感谢您的回复!我已经试着实现了你的建议,而且基本上是可行的,但是我遇到了一个特别奇怪的问题。如果我在以下条件下运行语法一次!如果满足条件,则为!如果命令将按预期运行。但是如果我再次运行我的语法,这次以这种方式!如果条件不满足,它仍将运行!如果命令。如果我在不改变任何内容的情况下再次运行语法,那么这次!如果命令无法运行。这就好像是一场灾难!IF conditional依赖于上次运行的my cond var的值。例如,IF!如果条件为(!A=1),我手动创建一个SPSS变量B=1并将其写入!A(使用您描述的方法),该!如果命令将按预期运行。如果我运行语法,但是B=0,那么!如果命令仍将运行。如果我在B=0的情况下再次运行,则!如果命令无法运行。如果我在B=1的情况下再次运行,则!如果命令无法运行。但是如果我用B=1再次运行它,那么!如果命令将运行。我不确定这是否是问题所在,但我正在尝试在宏中运行整个过程。宏获取数据,将变量写入宏变量,然后在!IF语句。我应该注意,如果我将B变量写入宏变量!A、 然后计算C=!A、 C将显示为正确的值。只有当我尝试使用它的时候!在一个小时内!如果SPSS似乎将其视为一种条件!A以前指定的值<代码>定义测试()计算B=1。如果$CASENUM=1,则执行此操作。WRITE OUT=“H:\TEMP\MACRO\u CONTROL.sps”/“DEFINE!A()”,B“!ENDDEFINE.”。结束如果。执行。插入FILE=“H:\TEMP\MACRO\u CONTROL.sps”。执行。计算C=!A.频率C!如果(!EVAL(!A)>=1)!然后是FREQ var1!伊芬德!ENDDEFINE.(1)您确定要重新定义吗!每次B(#行数)更改时,在尝试在
中的宏中使用A(或!N#u例)!如果
语句?(2) 在宏中运行宏定义可能会有问题-请尝试通过分离宏进行调试,打印出B和of的值!A在<代码>之前和期间!如果。