为什么 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)语句行。这也将使数据步骤定义在数据行开始的地方结束更清楚,并防止您在数据之后意外插入数据步骤的其他语句。
当我运行下面的代码第三个观察结果没有输出。为什么 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)语句行。这也将使数据步骤定义在数据行开始的地方结束更清楚,并防止您在数据之后意外插入数据步骤的其他语句。