SAS中字符数据的编号范围列表

时间:2018-03-02 22:08:46

标签: sas

我试图创建变量Cap1到Cap6。我不确定如何将它们作为字符数据读取。我的代码是:

DATA Capture;
    INFILE '/folders/myfolders/sasuser.v94/Capture.txt' DLM='09'x  DSD MISSOVER FIRSTOBS=2;
    INPUT Sex $ AgeGroup $ Weight Cap1 - Cap6 $;
RUN;

我的问题是Cap1到Cap5被解释为数值数据。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您的问题很简单:您使用的是变量列表,但您并未将$应用于整个变量列表!您需要在列表周围( )和修改器将其应用于整个列表。

请参阅:

DATA Capture;
    INFILE datalines DLM=' '  DSD;
    INPUT Sex $ AgeGroup $ Weight (Cap1 - Cap6) ($);
datalines;
M 18-34 135 A B C D E F
F 35-54 115 G H I J K L
;;;;
RUN;

答案 1 :(得分:2)

实际上,

我也希望这个输入语句像你一样工作,但事实并非如此。在$之后放置Cap1也无法解决此问题,如此日志所示。

26             INPUT Sex $ AgeGroup $ Weight Cap1 $ - Cap6 $;
                                                    _
                                                    22
ERROR 22-322: Expecting a name.  

你可以解决它

在阅读变量之前为变量指定格式,例如format Cap1 - Cap6 $2.;

要测试它,

我将数据包含在源文件中,即使用datalines

DATA Capture;
    INFILE datalines DLM='09'x  DSD missover FIRSTOBS=1;
    format Sex $1. AgeGroup $9. Weight 8.2 Cap1 - Cap6 $2.;
    INPUT Sex AgeGroup Weight Cap1 - Cap6;
    datalines;
M   1-5 24.5    11  12  13  14  15  16
M   6-10    34.2    21  22  23  24  25  26
;
proc print;
proc contents;
RUN;

如何理解:

SAS最初是作为非开发人员(ic统计学家)的编程语言而创建的,他们不关心数据格式,所以SAS为你做了很多猜测工作>(就像VBA一样,如果你不使用option explicit)。

因此,当您第一次在data步骤中提及变量名称时,SAS会向程序数据向量(PDV)广告一个变量,其中包含适当的类型(数字或字符)和长度,但这是猜测工作。

例如:由于SAS标准安装中包含的测试数据集CLASS中的第一个学生是男性,

data WORK.CLASS;
    set sasHelp.CLASS;
    select (sex);
        when ('M') gender = 'male';
        when ('F') gender = 'female';
        otherwise  gender = 'unknown';
    end;
run;

导致截断女性'四个职位: enter image description here

您可以通过指示sas预先将变量添加到PDV来纠正此问题。

对于字符变量

  • format myName $20.;
  • length myName $20.;是等效的,
  • informat myName $20.;也差不多。

(尽管使用用户定义的格式,存储变得更加复杂。)

对于数字,存在巨大差异:

  • length mySize 8.;在PDV for mySize
  • 中保留8个字节
  • format mySize 8.;告诉SAS打印或显示最多8位且没有小数的mySize
  • informat mySize $20.;告诉SAS在阅读mySize时期望8位数字,不带小数。

数值只能有一定的长度,具体取决于操作系统。在窗口

  • 8.是默认值,对应于大多数数据库中的double
  • 4.对应一个浮动
  • 3.是最低限度,我用于布尔值

格式可能非常不同

  • format mySize 8.3;告诉SAS使用8个字符打印mySize,其中包括小数的3位小数(如果小数点为正值,则会在小数点前留出最多4位小数的空间。小数字将减去打印以显示更大的数字)
  • format mySize 8.3;告诉SAS读取mySize,假设最后3位小数是分数,因此12345678将被解释为12345.678

然后有特殊格式来读取和写入日期,时间等以及用户定义的值和图片格式,但这导致我太过分了。