2017-10-13 1 views
2

私は本当に簡単だと思ったことをしたい。 マイ(モック)のデータは次のようになりますカラム/変数の遅延SPSS

enter image description here

data list free/totalscore.1 to totalscore.5. 
begin data. 
1 2 6 7 10 1 4 9 11 12 0 2 4 6 9 
end data. 

これらは(1から5までこの模擬データにおいて、)試行回数にわたって累積合計スコアです。各試行で得られた得点の数を知りたい。言い換えれば、n + 1試行からn試行の値を差し引いてみたいと思います。結果は次のようになりますようにするため ...

COMPUTE trialscore.1 = totalscore.2 - totalscore.1. 
EXECUTE. 

COMPUTE trialscore.2 = totalscore.3 - totalscore.2. 
EXECUTE. 

COMPUTE trialscore.3 = totalscore.4 - totalscore.3. 
EXECUTE. 

などなど: は、最も簡単な構文は次のようになり

enter image description here

しかし、もちろん、それは不可能であり、 200以上の変数に対してこれを行うのは楽しいことではありません。

COMPUTE #y = 1. 
VECTOR totalscore = totalscore.1 to totalscore.5. 
DO REPEAT trialscore = trialscore.1 to trialscore.5. 
COMPUTE #y = #x + 1. 
END REPEAT. 
COMPUTE trialscore(#i) = totalscore(#y) - totalscore(#i). 
EXECUTE. 

しかし、それは動作しません: 私はVECTORを使用して構文を記述し、次のようにREPEATを行うことを試みました。 何か助けていただければ幸いです。

ps。私はLAGを使用してみましたが、一度に1つの列を超える必要がある間、それは行をループします。

答えて

1

私はrespidが元の(一意の)レコード識別子であると仮定しています。

EDIT:

あなたがレコードindentifierを持っていない場合、あなたは非常に簡単にダミーを作成することができます:EDIT

compute respid=$casenum. 
exe. 

終わりをあなたは再試みることができますデータを構造化することで、各スコアが明確なレコードとなるようにします。

varstocases 
/make totalscore from totalscore.1 to totalscore.5 
/index=scorenumber 
/NULL=keep. 
exe. 

スコア(lag機能を使用するためのベールであるために)降順になるように、あなたのケースを並べ替える:

sort cases by respid (a) scorenumber (d). 

は、その後、実際にlagベースの計算で

do if respid=lag(respid). 
    compute trialscore=totalscore-lag(totalscore). 
end if. 
exe. 

を行います最後に、リストラを解除してください:

casestovars 
/id=respid 
/index=scorenumber. 
exe. 

totalscore変数のセット(最後の変数は空になります)が必要なものを保持します。

+0

horace_vrこんにちは、あなたの助けのためにどうもありがとうございました。 私はコードを動作させるために "トライアルコア"を "totalscore"と交換する必要があると思います。 基本的には、データを転置してからラグを使用することをお勧めします。他の解決策はありますか?私は本当にインデックス/下付き文字がSPSSの構文で動作するかどうか不思議です。 また、一意のレコード識別子を持たない場合はどうすればよいですか? – TVV

+0

@TVV:あなたは交換について正しいです。私はコードを編集して、スワッピングはもはや必要ではありません。また、レコード識別子の作成方法についての行を追加しました。私はそれを解決する方法を知らない。ベクトルを使用する場合は、前の変数のデータを常に「調べる」必要があるため、常に警告が表示されますが、これは賢明な方法ではないと思います(警告を無視し、ある時点で最終的なエラーになることもあります))。あなたもPythonを試すことができますが、それはものが複雑すぎると思います。私のコードは非常に短く、1つの場所で編集する必要があります;) –

+0

@TVV:あなたは交換について正しいです。私はコードを編集して、スワッピングはもはや必要ではありません。また、レコード識別子の作成方法についての行を追加しました。私はそれを解決する方法を知らない。ベクトルを使用する場合は、前の変数のデータを常に「調べる」必要があるため、常に警告が表示されますが、これは賢明な方法ではないと思います(警告を無視し、ある時点で最終的なエラーになることもあります))。あなたもPythonを試すことができますが、それはものを複雑にすると思います。私のコードはかなり短く、1つの場所で編集する必要があります;) –

0

あなたはdo repeatをこのように使用することができます。

do repeat 
    before=totalscore.1 to totalscore.4 
    /after=totalscore.2 to totalscore.5 
    /diff=trialscore.1 to trialscore.4 . 
compute diff=after-before. 
end repeat.