Пытается объединить значения из наборов данных в массив в sas

Я пытаюсь добавить шаг данных, который создает набор данных 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;

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

user667489 15.12.2018 13:15

Это домашнее задание? Какой у вас опыт работы с SAS?

Richard 15.12.2018 13:43

мне просто нужно вернуться к моему компьютеру, это проект для класса сертификатов sas, небольшая часть которого я била головой с благодарностью всем за вашу помощь !!

Thomas Joines 15.12.2018 19:39

Я думаю, это то, чего вы хотите и пытаетесь достичь. Вам нужно добавить RETAIN или просто использовать PROC TRANSPOSE в реальной жизненной ситуации. stats.idre.ucla.edu/sas/modules/…

Reeza 16.12.2018 03:13
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
4
259
1

Ответы 1

Синтаксис 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);

Другие вопросы по теме