为什么 SAS 会因为缺失值而跳过整行数据值?

Why does SAS skip an entire row of data values due to missing value?

当我运行下面的代码第三个观察结果没有输出。为什么 SAS 忽略了第三个观察结果?

data info;
    input Gender $ Age Height Weight;
    datalines;
    M 45 72 149
    F  64 62
    M 61 72 271
    F 29 73 125
    M 16 65 178
    ;
Run;

title "Listing of Dataset Demographics";

proc print data=info;
run;

默认值会帮助您,SAS 中的默认值是 FLOWOVER,因此如果记录丢失,它会在下一行查找它。您需要 MISSOVER 或 TRUNCOVER。

您的日志告诉您发生了以下注释:

 NOTE: SAS went to a new line when INPUT statement reached past the end of a line.

这个有效:

data info;
    infile cards truncover;
    input Gender $ Age Height Weight;
    datalines;
    M 45 72 149
    F  64 62
    M 61 72 271
    F 29 73 125
    M 16 65 178
    ;
Run;

documentation here 中的示例 2 提供了更多详细信息。

具体来说:

When you omit the MISSOVER option or use FLOWOVER (which is the default), SAS moves the input pointer to line 2 and reads values for TEMP4 and TEMP5 (variables it cannot find). The next time the DATA step executes, SAS reads a new line which, in this case, is line 3. This message appears in the SAS log:

NOTE: SAS went to a new line when INPUT statement reached past the end of a line.

文本行没有“观察”。他们只有台词。

它没有跳过任何数据行。它只使用两行进行第二次观察,因为第一行只有 INPUT 语句请求的 4 个变量中的 3 个的值。

这种行为就是 SAS 调用 INFILE 语句的 flowover 选项。这允许您使用多行文本来表示单个观察的数据,而不必过于挑剔您在不同数据观察之间插入换行符的字段。

如果您不希望它必须去寻找下一行文本中的下一个字段,那么请确保每个变量在文本行中都有一个值。您可以通过对数字或字符变量使用句点来表示缺失值。

所以使用这样的东西:

data info;
  input Gender $ Age Height Weight;
datalines;
M 45 72 149
F 64 62 .
M 61 72 271
. 29 73 125
M 16 65 178
;

使用 flowover 时,您可以根据需要插入任意数量的额外换行符,只要每个新观察都从新行开始。像这样

data info;
  input Gender $ Age Height Weight;
datalines;
M 45 72 
149
F 64 
62  .
M 
61 72 271
F 29 73 125
M 16 65 178
;

如果您希望 SAS 在行中没有更多值时放弃,请使用 infile 语句中的 flowover 选项。

data info;
  infile datalines flowover;
  input Gender $ Age Height Weight;
datalines;
M 45 72 149
F 64 62 
M 61 72 271
F 29 73 125
M 16 65 178
;

还有较旧的 missover 选项,但您通常不会想要它,因为它会在行尾设置值,该值对于显式 INFORMAT 宽度而言太短而无法丢失,而不仅仅是使用可用的字符数。

PS 不要缩进数据行。这只会使代码更难阅读,并且有关无效数据值的诊断消息更难以解释。为了更容易,也不要打算使用 DATALINES(又名 CARDS)语句行。这也将使数据步骤定义在数据行开始的地方结束更清楚,并防止您在数据之后意外插入数据步骤的其他语句。