2017-02-22 80 views
0

我运行一个程序是这样的:SAS输出语句,并保持语句

data january; 
set allmonths (keep=product month num_sold cost); 
if month='jan' then output january; 
sales=num_sold*cost; 
put sales; 
keep product sales; 
run; 

数据集月份包含两个变量:产品和销售。但销售价值缺失。

product sales 
a  . 

我有点理解为什么销售值缺失,因为它没有在输出语句前的allmonth数据集中定义。

那么为什么如果输出语句没有它,这个变量可以包含在数据集1月份。保持语句可以包括每个数据集列出的每个变量,然后为什么没有值写入数据集。

我想我可能知道原因。保持声明是关于变量的,输出是关于观察值的。

但我还是想问问和学习。

谢谢!

回答

1

Keep是在开始处理数据之前在数据步骤的编译阶段处理的那些SAS语句之一。在执行if语句和输出语句之前,决定在输出表中保留哪些变量(由于keep语句)。编写代码的等效方式可以更清楚的是:

data january (keep= product sales); 
set allmonths (keep=product month num_sold cost); 
if month='jan' then output january; 
sales=num_sold*cost; 
put sales; 
run; 

为了简化它,让它做你可能想要的东西:

data january(keep=product sales); 
set allmonths(keep=product month num_sold cost); 
where month='jan'; 
sales=num_sold*cost; 
run; 
+0

谢谢!清除我的想法。 – Lin

0

OUTPUT声明立即运行。因此,在您计算SALES的值之前,它正在写入记录。尝试在IF/THEN/OUTPUT语句之前添加另一个PUT语句,您可以看到将输出的值。

对于此问题,您可能希望使用子集化IF语句或WHERE语句,而不是显式运行OUTPUT语句。如果您删除了OUTPUT语句,那么数据步骤将自动输出数据步骤结束时的记录。

data january; 
    set allmonths; 
    if month='jan'; 
    sales=num_sold*cost; 
    keep product sales; 
run; 
+0

谢谢!你和Paul的答案描述了Output和Keep语句在数据步骤中的工作原理。很有帮助。谢谢你们! – Lin