【问题标题】:SPSS: DO REPEAT with different numbers of matched variablesSPSS:使用不同数量的匹配变量重复
【发布时间】:2017-07-02 07:18:25
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: repeat spss


    【解决方案1】:

    另一种方法是在外部使用LOOP,在内部使用DO REPEAT。所以这里有一些示例数据,只有三个从 1 到 10 的 A 变量。

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

    【讨论】:

    • 整洁!以前从未使用过LOOP/DO REPEAT 组合。除了必须写出所有VECTOR 命令之外,这会非常有效。特别是如果您有几个或单个 A 变量(如您的示例中所示),因此不必深入研究宏语言。
    • 太棒了,谢谢你们的回答!作为一个对 SPSS 比较陌生的人,我很欣赏循环/重复方法,因为它在概念上是有意义的。
    【解决方案2】:

    看起来您正在尝试循环遍历 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多