我已经检查了之前关于它的帖子(SPSS最后一次可用的测量变量),但我仍然怀疑如何更有效地执行此任务。我有一个包含9800万行和120个变量的数据集(每月一个,从2005年1月到2014年12月)。 对于数据集中的每个观察,我需要识别变量行中的第一个和最后一个有效(非缺失)测量值。 数据集如下所示:
v1 v2 ... v120
1 2 ... 5
。 2 ... 5
3 1 ......
我已尝试使用循环版本(也就此主题提出建议:SPSS最后一行变量中的可用测量值)。我使用下面的语法,但它们不起作用。我一直收到错误消息......很可能是因为我不理解其中的所有步骤,所以我误用了它。
DEFINE LAST_VALID ()
!DO !@ = 1 !TO 120 .
!LET !a = !CONCAT("v", !@) .
COMPUTE LAST_VALID = !a .
!DOEND .
!ENDDEFINE.
LAST_VALID .
EXECUTE.
错误消息(其中一些):
列1024中的错误#4382。文本:(命令结束)>在> COMPUTE命令中的目标变量之后预期未找到等号。 >执行此命令停止。
警告#231>宏嵌套的深度已达到当前限制。 >要增加>限制,请使用SET MNEST。要检查限制,请使用SHOW>命令。
第9栏中的警告#210。文本:!ERROR_MACRO>在此上下文中,宏符号无效>。 >该符号将被视为无效的特殊>字符。
第9列中的错误#4285。文本:!ERROR_MACRO>变量名称不正确:>名称超过64个字符,或者>未由>上一个命令定义。 >执行此命令停止。
DEFINE FIRST_VALID ()
!DO !@ = 1 !TO 120 .
!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.
错误消息(其中一些):
警告#231>宏嵌套的深度已达到当前限制。 >要增加>限制,请使用SET MNEST。要检查限制,请使用SHOW>命令。
第18栏中的警告#210。文本:!ERROR_MACRO>在此上下文中,宏符号无效>。 >该符号将被视为无效的特殊>字符。
第18列中的错误#4007。文本:!ERROR_MACRO>表达式>不完整。检查缺少的操作数,无效的运算符,>不匹配的>括号或过多的字符串长度。 >停止执行此命令。
第18列中的错误#4846。文本:!ERROR_MACRO> LOOP命令在IF子句结束后包含>无法识别的文本。
第9栏中的警告#210。文本:!ERROR_MACRO>在此上下文中,宏符号无效>。 >该符号将被视为无效的特殊>字符。
第9列中的错误#4285。文本:!ERROR_MACRO>变量名称不正确:>名称超过64个字符,或者>未由>上一个命令定义。 >停止执行此命令。
第13列中的错误#4014。文本:!ERROR_MACRO> SPSS Statistics是>期待表达但遇到>命令的结束。检查>表达式是否有省略或额外的操作数,运算符和>括号。 >停止执行此命令。
错误#4045。命令名称:END LOOP> END LOOP命令不遵循>未闭合的LOOP命令。由于错误,可能无法识别LOOP>命令>。使用> SPSS Statistics命令左侧显示的控制级别>来确定> LOOP和DO IF的范围。*
我可能忘记调整我的语法,但我无法弄清楚是什么。 如果它太明显我道歉...
答案 0 :(得分:2)
从您的描述或您的代码片段中不清楚您想要什么。最后一个实际值或该值的索引位置。例如。如果最后一个有效值在V110中并且等于5表示记录100万,你想知道“110”还是想知道“5”。
这是一种使用DO REPEAT
的简单方法,它将返回。 LastVal
在我的示例中将是“5”,LastId
将是110。
DO REPEAT V = V1 TO V120 /#i = 1 TO 120.
DO IF NOT MISSING(V).
COMPUTE LastVal = V.
COMPUTE LastId = #i.
END IF.
END REPEAT.
要同时返回第一个索引和值,您可以在DO IF
内执行一秒DO REPEAT
。
NUMERIC FirstVal FirstId.
DO REPEAT V = V1 TO V120 /#i = 1 TO 120.
DO IF NOT MISSING(V).
COMPUTE LastVal = V.
COMPUTE LastId = #i.
DO IF MISSING(FirstVal).
COMPUTE FirstVal = V.
COMPUTE FirstId = #i.
END IF.
END IF.
END REPEAT.
拥有9800万条记录,这可能需要一段时间 - 特别是如果不在服务器上。您可以使用VARSTOCASES
进行试验,默认情况下会删除丢失的数据。但是这些都会一直持续到完成为止。
您可以通过使用LOOP
来获得相同效果的效率方面的一些改进,但是在遇到第一个有效值时会突破。所以对于你可以做的第一个有效值。
VECTOR V = V1 TO V120.
LOOP #i = 1 TO 120.
END LOOP IF NOT MISSING(V(#i)).
COMPUTE FirstVal = V(#i).
COMPUTE FirstId = #i.
对于最后一个值,您只需要反转循环。
VECTOR V = V1 TO V120.
LOOP #i = 120 TO 1 BY -1.
END LOOP IF NOT MISSING(V(#i)).
COMPUTE LastVal = V(#i).
COMPUTE LastId = #i.