SPSS:DO REPEAT具有不同数量的匹配变量

时间:2017-02-14 05:44:37

标签: repeat spss

我有一个数据集,其中每个案例都有以下变量集:

VarA1.1到VarA25.185(共4625个变量) VarB.1到VarB.185(共185个变量)

对于每种情况,VarA1.1,VarA2.1,VarA3.1等都链接到相同的VarB.1。

我想使用DO REPEAT函数使用VarA和VarB搜索每个.1实例。

示例代码:

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.

但是,似乎因为VarA和VarB的重复列表中存在不同数量的变量,所以它们不会配对。我想将每个VarA#(1-25)。1与VarB.1相关联,每个VarA#(1-25).2与每个VarB.2等相关联,直到VarB.185,以便在重复函数中正确使用变量配对。

谢谢!

2 个答案:

答案 0 :(得分:4)

另一种方法是在外面使用LOOP,在内部使用DO REPEAT。所以这里有一些示例数据,只有三个A变量为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遍历每个A向量。

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语句。但我认为这是编写程序的概念清晰方式。

答案 1 :(得分: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.