Я пытаюсь добавить шаг данных, который создает набор данных work.orders_fin_qtr_tot из набора данных work.orders_fin_tot. Этот новый набор данных должен содержать новые переменные для квартальных продаж и прибыли. Используйте два массива для создания новых переменных: QtrSales1-QtrSales4 и QtrProfit1-QtrProfit4. Они представляют собой общий объем продаж и общую прибыль за квартал (1-4). Используйте номер квартала года, в котором был размещен заказ, для индексации в правильную переменную, чтобы добавить либо TotalSales, либо TotalProfit к новой соответствующей переменной.
Добавьте шаг Proc, который отображает первые 10 наблюдений набора данных work.orders_fin_qtr_tot.
Моя проблема в том, что я не могу объединить два массива diff без пробелов.
proc sort data=work.orders_fin_tot_qtr;
by workqtr;
run;
data work.orders_fin_tot_qtr;
set work.orders_fin_tot_qtr;
array QtrSales{4} quarter1-quarter4 ;
do i = 1 by 1 until (last.order_id);
if workqtr=i then QtrSales{i}=totalsales;
end;
drop totalsales totalprofit _TYPE_ _FREQ_;
run;
proc print data=work.orders_fin_tot_qtr;
run;
Это домашнее задание? Какой у вас опыт работы с SAS?
мне просто нужно вернуться к моему компьютеру, это проект для класса сертификатов sas, небольшая часть которого я била головой с благодарностью всем за вашу помощь !!
Я думаю, это то, чего вы хотите и пытаетесь достичь. Вам нужно добавить RETAIN или просто использовать PROC TRANSPOSE в реальной жизненной ситуации. stats.idre.ucla.edu/sas/modules/…



Синтаксис last.order_id подходит только в том случае, если на шаге DATA есть оператор BY - если его нет, то последний. ссылка всегда отсутствует, и цикл никогда не закончится; Итак, вы закодировали бесконечный цикл!
У ступеньки есть drop totalsales totalprofit _TYPE_ _FREQ_. Эти подчеркнутые переменные указывают на то, что входящий набор данных, вероятно, был создан с помощью Proc SUMMARY.
Ваш набор данных orders_fin_tot должен иметь столбцы order_id, quarter (допустимые значения 1,2,3,4) и totalsales. Если данные многолетние, в них должен быть другой столбец с именем year.
Отсутствующие BY и присутствующие last.id указывают на то, что вы изменяете данные из категориального вектора, идущего вниз по столбцу, в вектор, который проходит через строку - это называется поворотом или транспонированием. Конструкция do, которую вы показываете в вопросе, неверна, но похожа на конструкцию метода, известного в кругах SAS как цикл DOW - особенность метода заключается в том, что SET и BY кодируются циклом внутри.
Попробуйте настроить свой код по следующему шаблону
data want;
do _n_ = 1 by 1 until (last.order_id);
SET work.orders_fin_tot; * <--- presumed to have data 'down' a column for each quarter of an order_id;
BY order_id; * <--- ensures data is sorted and makes automatic flag variable LAST.ORDER_ID available for the until test;
array QtrSales quarter1-quarter4 ; * <--- define array for step and creates four variables in the program data vector (PDV);
* this is where the pivot magic happens;
* the (presumed) quarter value (1,2,3,4) from data going down the input column becomes an
* index into an array connected to variables going across the PDV (the output row);
QtrSales{quarter} = totalsales;
end;
run;
Обратите внимание, что внутри и вне цикла нет оператора OUTPUT. Когда цикл завершает свою итерацию, поток кода достигает нижней части шага данных и выполняет неявный ВЫХОД (потому что в другом месте шага нет явного ВЫВОДА).
Кроме того, для любого набора данных, указанного в коде, вы можете использовать опцию набора данных OBS=, чтобы выбрать, какие номера наблюдений будут использоваться.
proc print data=MyData(obs=10);
OBS - хитрое название опции, потому что на самом деле оно означает номер последнего наблюдения для использования. FIRSTOBS - это еще один вариант набора данных для указания номеров строк, которые следует использовать, и, если он не указан, по умолчанию используется 1. Таким образом, приведенное выше эквивалентно
proc print data=MyData(firstobs=1 obs=10);
OBS = следует концептуально рассматривать как LASTOBS =; нет фактического имени опции LASTOBS. Следующее будет записывать ERROR:, потому что OBS <FIRSTOBS
proc print data=MyData(firstobs=10 obs=50);
Обновите свой вопрос, включив в него образцы данных, которые мы можем использовать для воспроизведения вашей проблемы, и соответствующий результат, который вы пытаетесь получить. Разместите образцы данных в виде текста в вопросе, а не в виде снимка экрана.