2017-02-14 8 views
4

異なる数でREPEATをDO Iは、各場合、変数の次のセットを有するデータセットを有する:VarA25.185にSPSS:マッチ変数

VarA1.1(4625個の変数の合計) VarB.1 VARBに.185(合計185変数)

それぞれの場合、VarA1.1、VarA2.1、VarA3.1などはすべて同じVarB.1にリンクされています。

私はVarAとVarBの両方を使ってそれぞれの.1インスタンスを検索するためにDO REPEAT関数を使いたいと思っています。

例のコードは:

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に関連付けたいので、リピート機能では正しい変数のペアリングが使用されます。

ありがとうございます!

答えて

4

もう一つの方法は、内側に外側にLOOPDO REPEATを使用することです。ここでは、1から10までの3つの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文のすべてを定義する必要があるため、マクロ的なアプローチを打つつもりはないされて

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. 

コードゴルフ。しかし、私はそれがプログラムを書くための概念的に明確な方法だと思う。

+0

ニート!前に 'LOOP' /' DO REPEAT'コンボを使用したことはありません。 'VECTOR'コマンドをすべて書く必要はありませんが、それは本当にうまくいくでしょう。特に、あなたの例のようにいくつかの、あるいは一つの 'A'変数があり、マクロ言語を掘り下げなければならない場合は特にそうです。 –

+0

驚くばかり、あなたの答えにお答えください! SPSSについて比較的新しい人として、私は概念的に意味をなされるループ/ドゥー・リピート・アプローチを感謝します。 – ScienceStudent

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.