我正在寻找如何在一行变量中获得最后一个可用的测量值。
数据集如下所示:
变量 1 变量 2 变量 3 变量 4 变量 5... 变量 100
25 30 11 。. .
30 . . . . .
44 15 22 35 16 24
. . 31 27 。.
我想用每行中的值来识别最后一个可用变量。请让我知道是否可以在不将所选变量重组为案例的情况下做到这一点。
我正在寻找如何在一行变量中获得最后一个可用的测量值。
数据集如下所示:
变量 1 变量 2 变量 3 变量 4 变量 5... 变量 100
25 30 11 。. .
30 . . . . .
44 15 22 35 16 24
. . 31 27 。.
我想用每行中的值来识别最后一个可用变量。请让我知道是否可以在不将所选变量重组为案例的情况下做到这一点。
当然。复制粘贴运行整个语法,而无需为演示打开任何数据。
data list free/v1 v2 v3 v4.
begin data
1 '' '' ''
1 2 '' ''
1 2 3 ''
1 2 3 4
end data.
do repeat v = v1 to v4.
if not missing(v) last_valid = v.
end repeat.
exe.
对于第一个有效值,您可以使用类似于以下语法的内容。请注意,还有一种计算速度更快的替代方法(使用loop
and break
),但这需要更多代码。如果下面的代码需要很长时间才能完成,我会为您编写快速版本,但让我们先尝试简单的解决方案。
data list free/v1 v2 v3 v4.
begin data
'' '' '' 4
'' '' 3 4
'' 2 3 4
1 2 3 4
end data.
numeric first_valid.
do repeat v = v1 to v4.
if not missing(v) and missing(first_valid) first_valid = v.
end repeat.
exe.
感谢你的回答!它帮助我朝着正确的方向前进。我最终得到了替代代码,用于按照您的建议使用循环计算连续的第一个有效测量值。
一行测量中的最后一个可用测量:
DEFINE last_valid ()
!DO !@ = 1 !TO 100.
!LET !a=!CONCAT("v",!@).
COMPUTE last_valid = !a.
!DOEND.
!ENDDEFINE.
last_valid.
EXECUTE.
连续第一个可用测量:
DEFINE first_valid ()
!DO !@ = 1 !TO 100.
!LET !a=!CONCAT("v",!@).
LOOP IF missing(first_valid) = 1.
COMPUTE first_valid = !a.
END LOOP IF first_valid > 0.
!DOEND.
!ENDDEFINE.
first_valid.
EXECUTE.