Рекурсия в массиве SAS

У меня есть существующий набор переменных a_0, ..., a_45, где a_i представляет количество вещей, которые у меня есть в день i. Я хотел бы создать новую коллекцию переменных b_0, ..., b_45 для представления дополнительных изменений в материалах, которые у меня есть в день i (т.е. b_k = a_k-a_ (k-1)). Мой подход:

data test;
    set dataset;
    array a a_0-a_45;
    array b b_0-b_45;
    b(1)=a(1);
    do i=2 to 45;
        b(i)=a(i)-a(i-1);
    end;
run;

Однако мои переменные b просто отсутствуют.

Можете ли вы предоставить образцы данных и полный код, чтобы мы могли воспроизвести проблему? На данный момент неясно, чего вы хотите или что не работает должным образом. С кодом все в порядке.

Reeza 20.03.2018 02:21

Ваш код в порядке. Вам нужно показать пример данных, где он не работает.

Tom 20.03.2018 04:32

Почему вы моделируете данные таким образом? Почему бы не иметь 46 строк с двумя переменными DAY и A, где DAY идет от 0 до 45?

Tom 20.03.2018 04:33

Я не вижу рекурсии - вы имели в виду итерацию?

Richard 20.03.2018 11:41

В массиве 46 элементов. Шлейф должен быть 2 to 46. Это может способствовать, а может и не способствовать вашей проблеме. Обычно ... to DIM(array) используется для перехода к последнему элементу типичного одномерного массива. Если оператор массива определяет границы индекса, вы должны использовать LBOUND(array) to HBOUND(array) для итерации от нижней до верхней границы индекса. Для многомерных (или n-мерных) массивов используется синтаксис LBOUND(array-name,dimension-n).

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

Ответы 3

Какие у вас начальные значения для a_1 - a_45 перед запуском цикла? Поскольку вы не инициализируете их (за исключением a_0a(1)), каждый член b(i) будет отличаться от двух терминов a, из которых по крайней мере один будет отсутствовать, если эти переменные не заполнены во входном наборе данных.

извините, это была опечатка. Мои переменные уже существуют и имеют значения. Я хочу создать значения b на основе этих существующих значений a

wida norse 20.03.2018 01:41

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

Пример данных

data have(keep=product_id note a_:);
  do product_id = 1 to 100;
    length note $15;
    array amount a_0-a_45;
    call missing(of amount(*));

    if (ranuni(123) < 0.5) then do;
      note = 'static deltas';
      static_delta = ceil(5 * ranuni(123));
      amount(1) = static_delta;
      do inventory_day = 2 to dim(amount);
        amount(inventory_day) = amount(inventory_day-1) + static_delta;
      end;
    end;

    else do;
      note = 'random deltas';
      amount(1) = ceil(5 * ranuni(123));
      do inventory_day = 2 to dim(amount);
        amount(inventory_day) = max ( 0, amount(inventory_day-1) + floor(10 * ranuni(123)) - 5 );
      end;    
    end;

    OUTPUT;
  end;
run;

Вычислить дельты

data want;
  set have;
  array amount a_0-a_45;
  array delta  b_0-b_45;

  delta(1) = amount(1);
  do i=2 to dim(amount);
    delta(i) = amount(i) - amount(i-1);
  end;

  drop i;
  format a_: b_: 4.;
run;

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

%macro f();                                                                                                                             
 data dataset;                                                                                                                          
   %do i = 0 %to 45;                                                                                                                    
   a_&i. = ranuni(2);                                                                                                                   
   %end;                                                                                                                                
 run;                                                                                                                                   
%mend;                                                                                                                                  


%f();                                                                                                                                   

data test;                                                                                                                              
     set dataset;                                                                                                                       
     array a1 a_0-a_45;                                                                                                                 
     array b1 b_0-b_45;                                                                                                                 
     /* This line will help in avoiding b_0 to have a missing value */                                                                  
     b1(1)=a1(1);                                                                                                                       
     do i=2 to 46;                                                                                                                      
         b1(i)=a1(i)-a1(i-1);                                                                                                           
     end;                                                                                                                               
 run;

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