我想做一些我认为非常简单的事情。 我的(模拟)数据看起来像这样:
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.
依旧...... 所以结果看起来像这样:
但是,对于200多个变量来说,这样做是不可能也不好玩的。 我尝试使用VECTOR和DO REPEAT编写语法如下:
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.
但它不起作用。 任何帮助表示赞赏。
聚苯乙烯。我已经研究过使用LAG,但是我需要它来循环遍历行,而我需要它一次超过1列。
答案 0 :(得分:1)
我假设respid
是您原始(唯一)的记录标识符。
修改强>
如果您没有记录标识符,则可以非常轻松地创建虚拟标识符:
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
个变量(最后一个变量为空),这些变量将保留你需要的变量。
答案 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.