如何在SAS中正确读取含缺失值的原始数据文件并正常显示?
解决SAS读取含缺失值数据的问题
问题分析
你的原始代码存在两个核心问题:
- 未跳过表头行:数据第一行是列名(ID、Age等),代码直接将其当作数据行读取,导致第一行数据完全错误。
- 缺失值处理不当:第四行数据中Sex字段缺失,使用空格分隔的列表输入会将Date值错误分配给Sex变量(因Sex定义为$1,会被截断为第一个字符),同时Date字段变为缺失。
修正后的代码
使用固定列输入是处理这类结构化数据最可靠的方式,直接根据字段在每行的固定位置读取:
data mydata; infile 'percorso_del_tuo_file/nome_file.txt' firstobs=2; /* 跳过第一行表头 */ /* 按固定列位置读取每个变量 */ input ID $1-4 /* ID 占第1-4列 */ Age 6-7 /* Age 占第6-7列 */ Sex $9 /* Sex 占第9列 */ Date $11-18; /* Date 占第11-18列 */ run; /* 查看读取后的数据 */ proc print data=mydata noobs; run;
代码说明
firstobs=2:告诉SAS从第二行开始读取数据,跳过第一行的表头。- 固定列输入:明确指定每个变量在文本文件中的列位置,即使存在缺失值(如第四行的Sex),也能准确对应到变量,避免数据错位。
proc print:用于输出读取后的数据集,验证数据是否正确。
替代方案(列表输入)
如果你偏好使用列表输入,可以通过添加逻辑修正缺失值导致的错位:
data mydata; infile 'percorso_del_tuo_file/nome_file.txt' dlm=' ' missover firstobs=2; length ID $4 Age 3 Sex $1 Date $8; input ID Age Sex Date; /* 修正第四行的错位问题:当Sex非空且长度超过1时,说明Date被错误分配给了Sex */ if length(Sex) > 1 then do; Date = Sex; Sex = ' '; end; run;
但此方案依赖数据的特定异常特征,可靠性不如固定列输入。
内容的提问来源于stack exchange,提问作者RUGGIERO ZAGARIA
相关产品推荐
相关产品推荐

