2017-02-22 25 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 перед тем оператором вывода.

Тогда почему эта переменная может быть включена в отчет набора данных, если выходной оператор не имеет его. Оператор Keep может включать каждую переменную, указанную в каждом наборе данных, а затем почему в набор данных не записывается никакое значение.

Я думаю, я мог бы знать причину. Держите заявление о переменных, выход - о наблюдениях.

Но я все еще хочу спросить и узнать.

Спасибо!

ответ

1

Keep - это одно из этих операторов SAS, которое обрабатывается во время фазы компиляции для этапа данных, прежде чем он начнет обработку данных. Решение о том, какие переменные хранить в выходной таблице january было принято (из-за оператора keep) до того, как будут выполнены ваши операторы if и output. Эквивалентный способ написания кода, который может сделать его яснее:

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. Попробуйте добавить еще одну инструкцию PUT перед оператором IF/THEN/OUTPUT, и вы увидите значения, которые будут выводиться.

Для этой проблемы вы, вероятно, захотите использовать инструкцию IF подмножества или инструкцию WHERE вместо явного запуска инструкции OUTPUT. Если вы удалите оператор OUTPUT, тогда шаг данных автоматически выведет записи в конце шага данных.

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

Спасибо! Ответы от вас и Павла рассказали о том, как вывод Output and Keep работает на этапе данных. Очень полезно. Спасибо вам всем! – Lin