Изменение меток на имена столбцов в sas - PullRequest
0 голосов
/ 20 февраля 2020

Я гуглил, как изменить метку столбца / переменной на имя столбца / переменной в SAS.

, например,

Прямо сейчас у меня есть имя столбца / переменной, подобное этому .

enter image description here

THEN метка столбца / переменной выглядит следующим образом.

enter image description here

Я хочу изменить на этот ярлык имя столбца

, поэтому я нашел это решение, но я делаю что-то не так.

https://communities.sas.com/t5/SAS-Programming/Changing-Labels-into-Column-Names/td-p/520503

имя моего набора данных: work.Inst_char8

Я пытался вот так.

  proc sql noprint;
    select cats(name,'=', case when label is not null then nliteral(label ) 
                                else name end) into: rename separated by ' '
    from work.Inst_char8
    where libname='WORK' and memname='Inst_char8';
    quit;


data Inst_char8;
set Inst_char8(rename=(&rename));
run;

Ошибка

Следующие столбцы не найдены в участвующих таблицах: label, libname, memname, name

Я знаю, что "Rename" работает, но у меня есть 100 переменных.

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

Я бы хотел знать.

Спасибо

Column Name

INSTNM
IALIAS
ADDR
CITY
STABBR

label

Institution (entity) name
Institution name alias
Street address or post office box
City location of institution
State abbreviation 

1 Ответ

2 голосов
/ 21 февраля 2020

Пока метки уникальны и допустимы для использования в качестве имен, ваш метод basi c будет работать. Обратите внимание, что имена ограничены 32 байтами, а метки могут быть длиной до 256 байтов. И чтобы использовать метки в вашем примере в качестве имен, вам нужно установить для параметра VALIDVARNAME значение ANY.

options validvarname=any;

Но вам нужно запросить фактическую таблицу метаданных, которая имеет переменные атрибуты, а не таблицу данных. Обратите внимание, что значения LIBNAME и MEMNAME в DICTIONARY.COLUMN всегда в верхнем регистре. Также вы не можете переименовать переменную в имя, которое у нее уже есть.

proc sql noprint;
%let rename=;
select catx('=',nliteral(name),nliteral(substr(coalesce(label,name),1,32)))
  into :rename separated by ' '
from dictionary.columns 
where libname='WORK' and memname='INST_CHAR8'
  and name ne substr(coalesce(label,name),1,32)
;
%let num=&sqlobs ;
quit;

Быстрее просто изменить имена, используя PRO C DATASETS вместо копирования данных. Но если список переименований пуст, то вы получите сообщение об ошибке.

%if (&num) %then %do;
proc datasets lib=WORK nolist;
modify INST_CHAR8;
  rename &rename;
run;
quit;
%end;

Если вы собираетесь использовать опцию RENAME = dataset, тогда пустой список подойдет.

data new;
  set INST_CHAR8(rename=(&rename));
run;

Если конечной целью является загрузка в Tableau, то вы можете просто записать файл CSV. Файл CSV не имеет места для хранения информации о типах данных, но Tableau в целом игнорирует фактические типы данных полей и пытается классифицировать поля на основе значений, которые он видит.

proc export data=inst_char8 file='inst_char8.csv' replace dbms=csv label;
run;
...