SPSS - 如何识别一行120个变量中的第一个和最后一个可用测量

时间:2016-03-15 16:52:02

标签: spss

我已经检查了之前关于它的帖子(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的范围。*

我可能忘记调整我的语法,但我无法弄清楚是什么。 如果它太明显我道歉...

1 个答案:

答案 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.