SPSS:使用不同数量的匹配变量重复

SPSS: DO REPEAT with different numbers of matched variables

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

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,以便在重复函数中正确使用变量对。

谢谢!

看起来您正在尝试做的是遍历 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.

另一种方法是在外部使用 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 语句。但我认为这是一种概念清晰的程序编写方式。