SPSS中的条件处理

时间:2018-01-18 20:00:05

标签: macros conditional spss

我想有条件地处理语法块,其中条件基于活动数据集。

在SPSS宏中,您可以使用!IF /!IFEND宏命令有条件地处理语法块。但是,据我所知,用户需要使用!LET命令(!LET!FLAG = 1)或使用宏输入变量显式地为该标志赋值。这与我使用其他语言的经历大不相同,我可以根据我正在使用的数据编写具有分支逻辑的代码。

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

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

我正在尝试什么?提前感谢您的时间和考虑。

1 个答案:

答案 0 :(得分:1)

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

var
  A: AnsiString;
  B: TBytes;
begin
  A := 'Test';
  B := BytesOf(A);

  // convert it back
  SetString(A, PAnsiChar(B), Length(B));
end;

现在我们可以将值发送到宏中 - 通过使用宏定义编写单独的语法文件。

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.  

现在定义了宏,您可以在计算中使用该值(例如,如果您想将其用于分析不同的数据集,或者在当前数据不可用时在语法中使用)。
例如:

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'.

您也可以像在示例中一样在宏中使用它 - 您将看到新宏无法按原样读取compute just_checking= !N_CASES . 宏,这就是您需要的原因!N_CASES函数:

!eval()

如果您的数据中只有一行,那么现在运行宏将不会产生任何内容,并且如果有多行,则运行意味着:

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