SAS преобразует формат переменных в значение

Вопрос или проблема

У меня есть набор данных 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);

Пояснение к коду:

  1. Макрос format_to_value: Этот макрос принимает три параметра:

    • data — имя исходного набора данных,
    • out — имя выходного набора данных,
    • varlist — список переменных, которые нужно отформатировать.
  2. data &out; set &data;: Создается новый набор данных и загружается старый набор данных.

  3. %let nvars = %sysfunc(countw(&varlist));: Считается количество переменных в списке.

  4. Цикл do: Проходит по каждому элементу списка переменных и:

    • Получает формат переменной с помощью varfmt.
    • Если формат существует, создается новая переменная с отформатированным значением.
    • Исходная переменная удаляется, а отформатированная переменная переименовывается в исходное имя.
  5. Вызов макроса: В примере have — исходный набор данных, want — выходной набор данных, список переменных включает id, other_variable1 и other_variable2.

Применение макроса

С помощью данного подхода вы сможете легко и быстро конвертировать форматы переменных во всех необходимых наборах данных без необходимости ручной обработки каждой отдельной переменной. Просто вызовите макрос с нужными параметрами, и он выполнит всю работу за вас.

Этот подход автоматизирован и уменьшает вероятность ошибок, связанных с ручным перечислением переменных и их форматами.

Оцените материал
Добавить комментарий

Капча загружается...