SAS输出语句和keep语句

时间:2017-02-22 21:09:42

标签: sas output

我运行这样的程序:

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;

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

product sales
a        .

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

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

我想我可能知道原因。 Keep语句是关于变量的,输出是关于观察的。

但我还是想问问和学习。

谢谢!

2 个答案:

答案 0 :(得分:1)

Keep是在开始处理数据之前在数据步骤的编译阶段处理的SAS语句之一。在执行if和output语句之前,决定在输出表1月保留哪些变量(由于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;

答案 1 :(得分: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;