0

我尝试sas使用以下代码导入文本文件

PROC IMPORT DATAFILE= '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
OUT= outdata 
DBMS=dlm 
REPLACE; 
delimiter='09'x;
GETNAMES=YES; 
RUN;

但是我导入不成功,因为文本文件有丢失数据的期限

这是我在SAS日志中得到的

NOTE: Invalid data for class_size in line 455 16-17.
 
 455 CHAR  454.34.8.32.17.NA.23.125.12.188 31
     ZONE  3330330303303304403323330332333
     NUMR  454934989329179E1923E125912E188
 sl_no=454 school=34 iq=8 test=32 ses=17 class_size=. meanses=23.125 meaniq=12.188 _ERROR_=1 _N_=454

如何加载这个文本文件SAS

4

2 回答 2

1

您是否从 R 创建了该文本文件?该软件包有一个讨厌的习惯,就是将数值的 NA 文本值放入文本文件中。如果您是创建文件的人,您可能会检查您使用的系统是否有办法不将 NA 放入文件中。在分隔文件中,缺失值通常表示为该字段没有任何内容。因此,分隔符彼此相邻。对于 SAS,您可以使用句点来表示缺失值。

我不会费心使用 PROC IMPORT 来读取分隔文件。只需编写一个数据步骤即可读取文件。由于看起来您的文件只有六个变量并且它们都是数字的,因此代码很简单。

data outdata;
   infile '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
     dsd dlm='09'x firstobs=2 truncover
   ;
   input sl_no school iq test ses class_size meanses meaniq ;
run;

处理输入文件中的 NA 文本的一种方法是将它们替换为句点。由于所有字段都是数字的,因此您可以轻松地做到这一点,因为您不必担心替换恰好在字母 N 之后有字母 A 的真实文本。这是使用_INFILE_自动变量的技巧,您可以使用它来制作读取文件时即时更改。

data outdata;
   infile '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
     dsd dlm='09'x firstobs=2 truncover
   ;
   input @;
   _infile_=tranwrd(_infile_,'NA','.');
   input sl_no school iq test ses class_size meanses meaniq ;
run;
于 2020-11-15T16:24:56.863 回答
0

NOTE:由于NA该字段中的值,您得到了class_size

您认为句点(.)实际上是制表符(十六进制代码09)。查看句号下确认,ZONE0NUMR 909是制表符。

Proc IMPORT根据查看文本文件的前几行(默认为 20 行)来猜测每个字段的数据类型。您的文件仅包含 20 行的数字,因此猜测的过程class_size是数字。

有几个行动方案。

  • 没做什么。阅读您的日志NOTES并了解NA您的数据集中出现缺失值的位置。
  • 或者,
    按原样读取文件,但GUESSINGROWS=MAX;在导入代码中添加语句
    • 混合数据类型列将class_size被猜测为字符,您可能需要执行另一个步骤将值转换为数字(非数字值转换为缺失值的步骤)
  • 或者
    编辑文本文件,NA用句点 ( .) 替换所有 。点表示 IMPORT 期间的缺失值。IMPORT 步骤不会有任何不协调的地方来记录。

转换字段

PROC IMPORT DATAFILE= '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt'
  DBMS=dlm REPLACE OUT=work.outdata;

  delimiter='09'x;
  GETNAMES=YES; 
  GUESSINGROWS=MAX;
RUN;

data want;
  set outdata (rename=(class_size=class_size_char));
  class_size = input (class_size_char, ?? best12.);
  drop class_size_char;
run;
于 2020-11-15T12:57:12.640 回答