SAS - 包含字符和数字的列的Freq

时间:2017-04-20 14:56:17

标签: sas

我有一个包含char和numeric变量的列。此列中的内容示例为

T
M
12
3112

我想在此列上执行proc频率(或使用任何其他函数)来读取char和numeric值。使用proc freq忽略char变量,仅执行数值操作。 感谢

2 个答案:

答案 0 :(得分:1)

我同意@Tom发布的代码更符合SO的指导原则。

@Tboy,您的问题不是关于proc freq,而是关于SAS数据集以及它们是如何在数据步骤中创建的。 proc freq只读取给它的内容。 SAS数据集是SAS数据集,由变量(类似于列)和观察(类似于行)组成。变量可以是字符数字,但不能同时是两者。没有变体数据类型,例如在VB中。字符变量可以包含数字,但它们被视为文本,通常是左对齐的,并且无法添加。

在数据步骤中,SAS变量不必像其他语言一样显式声明 - 比如VB。一旦引用它们就会被创建。引用它们的上下文确定它们是字符还是数字。

/* This creates a numeric variable */
data MyDataset;
    x = 1;

/* This creates a character variable */
data MyDataset;
    x = '1';

如果您尝试将两种不同的数据类型分配给同一个变量,那么SAS就会感到困惑,但是在其记录良好的情况下,它仍然会继续存在。如果没有代码片段,可能发生在你身上的事情就像下面那样,SAS在值T和M时咳嗽但是自己关闭并继续保持尊严,但是输出数据集的观察结果2和3已经缺失。

data MyDataset;
    x = 12; output;
    x = 'T'; output;
    x = 'M'; output;
    x = 12; output;
    x = 3112; output;
    run;

日志将包含以下消息:

  

注意:字符值已在以下位置转换为数字:(线):(列)9 14:9
  注意:第13行第9行的数字数据“T”无效。   注意:第14行第9行的数字数据“M”无效。   x = 3112 ERROR = 1 N = 1注意:数据集WORK.MYDATASET有5个观察值和1个变量。

SAS为您提供了通过使用length语句显式声明变量来解决此问题的选项。

data MyDataset;
    length x $ 4 y 8;
    x = '1234'; y = 1; output;
    x = 'ABCD'; y = 2; output;

通过在一个SAS数据集上执行proc contents,可以看出变量是字符还是数字:

proc contents data=MyDataset;

创建了以下输出,为简洁起见,我编辑了这个输出:

The CONTENTS Procedure

Data Set Name        WORK.MYDATASET           Observations          2 
Member Type          DATA                     Variables             2 
Engine               V9                       Indexes               0 

Alphabetic List of Variables and Attributes
#    Variable    Type    Len
1    x           Char      4
2    y           Num       8

通过阅读SAS系统上的介绍性文本和文档,也可以回答您的问题。

答案 1 :(得分:0)

这是PROC FREQ的一个小皱纹,可以解释你遇到麻烦的原因。默认情况下,PROC FREQ将忽略缺失值。示例中的两个非数字值都是单个字母,因此您的数字变量可能使用特殊缺失值。

如果是这样,您可以将MISSINGMISSPRINT选项添加到TABLES声明中。

missing t m ;
data test ;
  input @1 text $4. @1 numb 4. ;
cards;
T
M
12
3112
;

proc freq ;
  tables text numb ;
  tables numb / missing ;
run;