2016-08-04 4 views
1

Я пытаюсь использовать массив для создания новых переменных (например, изменения года на год и неделю на неделе). Я хочу, чтобы именовании, так что у меня есть сказать «заказы», ​​а затем использовать массив для создания «orders_LY» и «orders_LW»Использование массивов SAS для создания новых переменных с суффиксом

Это один работает (с кодом ниже)

LW=lag1(figures{i}); 

хотя это это не то, что я хочу,

это один не

figures{i}_LY=lag53(figures{i}); 


data summary_&type._&date.; 
    set summary; 


    array figures {5} tv_total_orders_&type. tv_total_bookings_&type. TV_AOV_&type. total_orders_&type. total_bookings_&type. ; 
    do i=1 to 5; 

    LW=lag1(figures{i}); 
    figures{i}_LY=lag53(figures{i}); 


    end; 
    run; 
+0

Создать другой массив? – Joe

+0

Будьте внимательны при передаче ссылки массива на функцию задержки. Когда вы кодируете 'lag1 (цифры {i}), функция lag создает только одну очередь, а не одну очередь для каждого элемента массива. Таким образом, значение tv_total_orders_ & type будет записано в tv_total_book_ & type и т. Д., Что, вероятно, не то, что вы намереваетесь. – Quentin

ответ

1

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

У вас есть два варианта, то:

Во-первых, вы могли бы создать второй массив так:

figures_ly {5} tv_total_orders_&type._ly tv_total_bookings_&type._ly TV_AOV_&type._ly total_orders_&type._ly total_bookings_&type._ly ; 

(возможно, потребуется сделать переменную инициализации атрибута, я не знаю ваших данных .) Это лучше всего, если вы знаете, что вам нужно, когда вы программируете, а список переменных не изменяется.

Во-вторых, вы можете использовать макроязык для определения этих переменных LY. Это более подходит, если вам нужно часто вносить изменения в список переменных и/или вы не знаете список до запуска программы (она управляется данными). Если это так, вы должны разместить дополнительную информацию о том, как определяется список, чтобы получить полезный ответ.

2

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

Создать некоторые переменные, которые мы хотим добавить суффиксы:

data fields; 
    length field $50; 
    input field $; 
    datalines; 
orders 
sold 
billed 
cost 
gp 
; 
run; 

Добавить суффиксы:

data config; 
    length new_name $50; 
    set fields; 
    new_name = field; output; 
    new_name = cats(field,'_LW'); output; 
    new_name = cats(field,'_LY'); output; 
    dummy=1; 
run; 

Транспонирование его, чтобы получить суффиксом переменные как имена столбцов:

proc transpose data=config out=trans(drop=_name_); 
    id new_name; 
    var dummy; 
run; 

Теперь вы можете определить свои массивы на основе существующих имен.

Смежные вопросы