我有一个包含char和numeric变量的列。此列中的内容示例为
T
M
12
3112
我想在此列上执行proc频率(或使用任何其他函数)来读取char和numeric值。使用proc freq忽略char变量,仅执行数值操作。 感谢
答案 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将忽略缺失值。示例中的两个非数字值都是单个字母,因此您的数字变量可能使用特殊缺失值。
如果是这样,您可以将MISSING
或MISSPRINT
选项添加到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;