Вопрос или проблема
У меня есть набор данных SAS, в котором для столбцов применены форматы. Таким образом, значение столбца является числовым, и когда я запрашиваю таблицу, она показывает значение из формата. Проблема в том, что я должен экспортировать данные в CSV, и поэтому я вижу оригинальные (числовые) значения в CSV вместо отформатированного значения.
Я знаю, что могу преобразовать форматы столбцов, используя оператор PUT.
id_formatted = PUT(id, NAME.);
Я сделал это так:
data want;
set have;
id_fmt = put(id, NAME.);
drop id;
rename id_fmt=id;
run;
Поскольку у меня есть довольно много таблиц с множеством столбцов с различными форматами, я хотел бы найти, есть ли простой способ отображать форматированные значения, а не делать это по одному.
Ответ или решение
Для решения задачи конвертации форматов переменных в SAS и извлечения отформатированных значений в формате CSV можно использовать макрос. Это позволит автоматизировать процесс, не применяя ручное изменение для каждой переменной в каждом наборе данных.
Вот пример, как можно реализовать такую задачу с помощью макроса. Этот макрос будет проходить по всем указанным столбцам и конвертировать их в отформатированные значения.
%macro format_to_value(data=, out=, varlist=);
data &out;
set &data;
%let nvars = %sysfunc(countw(&varlist));
%do i = 1 %to &nvars;
%let var = %scan(&varlist, &i);
/* Получаем формат переменной */
%let fmt = %sysfunc(varfmt(&data, &var));
/* Проверяем, есть ли формат */
%if &fmt ne %then %do;
&var._fmt = put(&var, &fmt.);
drop &var;
rename &var._fmt = &var;
%end;
%end;
run;
%mend;
/* Вызов макроса */
%format_to_value(data=have, out=want, varlist=id other_variable1 other_variable2);
Пояснение к коду:
-
Макрос
format_to_value
: Этот макрос принимает три параметра:data
— имя исходного набора данных,out
— имя выходного набора данных,varlist
— список переменных, которые нужно отформатировать.
-
data &out; set &data;
: Создается новый набор данных и загружается старый набор данных. -
%let nvars = %sysfunc(countw(&varlist));
: Считается количество переменных в списке. -
Цикл
do
: Проходит по каждому элементу списка переменных и:- Получает формат переменной с помощью
varfmt
. - Если формат существует, создается новая переменная с отформатированным значением.
- Исходная переменная удаляется, а отформатированная переменная переименовывается в исходное имя.
- Получает формат переменной с помощью
-
Вызов макроса: В примере
have
— исходный набор данных,want
— выходной набор данных, список переменных включаетid
,other_variable1
иother_variable2
.
Применение макроса
С помощью данного подхода вы сможете легко и быстро конвертировать форматы переменных во всех необходимых наборах данных без необходимости ручной обработки каждой отдельной переменной. Просто вызовите макрос с нужными параметрами, и он выполнит всю работу за вас.
Этот подход автоматизирован и уменьшает вероятность ошибок, связанных с ручным перечислением переменных и их форматами.