【问题标题】:Numbered range lists for character data in SASSAS中字符数据的编号范围列表
【发布时间】:2018-03-04 01:02:55
【问题描述】:

我正在尝试创建变量 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 被解释为数字数据。我该如何解决?

【问题讨论】:

    标签: sas


    【解决方案1】:

    您的问题很简单:您使用的是变量列表,但您没有将 $ 应用于整个变量列表!您需要 ( ) 围绕列表和修饰符将其应用于整个列表。

    见:

    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;
    

    【讨论】:

    【解决方案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 最初是为不关心数据格式的非开发人员(即统计学家)创建的编程语言,因此 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;
    

    导致将“女性”截断为四个位置:

    您可以通过指示 sas 预先将变量添加到 PDV 来纠正这种情况。

    对于字符变量,

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

    (不过,用户定义的格式会使故事变得更加复杂。)

    对于数字,有很大的不同:

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

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

    • 8. 是默认值,在大多数数据库中对应于双精度
    • 4. 对应一个浮点数
    • 3. 是最小值,我将其用于布尔值

    格式可以非常不同

    • format mySize 8.3; 告诉 SAS 用 8 个字符打印 mySize,包括 3 个小数用于小数 (如果它具有正值,则在小数点之前最多留出 4 个小数的空间。将打印更少的小数以显示更大的数字)
    • format mySize 8.3; 告诉 SAS 读取 mySize 假设最后 3 位小数是小数,所以 12345678 将被解释为 12345.678

    然后有特殊的格式来读写日期、时间等以及用户定义的值和图片格式,但这让我走得太远了。

    【讨论】:

    • 正是我想要的。谢谢你。对于这几个变量,这不是一个困难的解决方法,但是您的方法可以更轻松地处理更大的集合。
    • SAS 标准实践仍会在输入语句中使用$,但如果您有格式,这在技术上确实是不必要的。不过,我不会建议 format,但如果您采用这种方法,我会建议 informat,因为这似乎更适合输入数据。 (两者都将导致 SAS 主管向 PDV 添加字符变量,length 语句或带有$attrib 语句或输入语句中的$ 正确使用我的答案.)
    • 使用lengthattrib定义变量是否更清楚,而不是使用格式的赋值(不需要的格式)来强制SAS猜测你想要变量定义为具有与格式宽度匹配的长度。
    • 如果您已经将变量定义为字符,则input 语句中不需要$。只有当变量的第一个引用出现在 input 语句中时,您才需要添加 $,否则 SAS 会假定您指的是数字变量。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2022-11-27
    • 2011-04-23
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多