Подтвердить что ты не робот

Как читать имена переменных в наборе данных SAS?

Существуют ли какие-либо операторы\функции, способные получить имя переменных? Предпочтительно помещать их в столбец другого набора данных, текстовое поле или макрокоманду.

например.

- набор данных 1

Name age sex

    Jk   14   F
    FH   34   M
  • Ожидаемый набор данных

    Var_name_of_dataset1

    Name
    age
    sex
    

PS: Я знаю выражение: выберите, что действительно важно Он может считывать значение столбца в поле с настраиваемыми разделителями и, следовательно, желать, чтобы аналогичные способы чтения имен столбцов были в поле или столбец.

Спасибо

4b9b3361

Ответ 1

СОДЕРЖАНИЕ PROC будет самым быстрым способом получить эту информацию в наборе данных. Имена столбцов можно найти в столбце NAME.

proc contents data=sashelp.class out=contents noprint;
run;

Ответ 2

Вы также можете использовать функции datastep и array, например

data colnames ;
  set sashelp.class (obs=1) ;

  array n{*} _NUMERIC_ ;
  array c{*} _CHARACTER_ ;

  do i = 1 to dim(n) ;
    vname = vname(n{i}) ;
    output ;
  end ;
  do i = 1 to dim(c) ;
    vname = vname(c{i}) ;
    output ;
  end ;
run ;

Ответ 3

%macro getvars(dsn);
 %global vlist;
 proc sql;
 select name into :vlist separated by ' '
  from dictionary.columns
  where memname=upcase("&dsn");
 quit;
%mend;

Это создает макрокоманду с именем & vlist, которая будет содержать имена всех переменных в вашем наборе данных, разделенные пробелом. Если вы хотите запятые между именами переменных, все, что вам нужно сделать, это изменить значение "разделяемое" с "на",". Использование функции upcase в инструкции where позволяет избежать проблем с передачей имени набора данных в неправильном случае. Глобальный оператор необходим, поскольку созданная макрокоманда не обязательно будет доступна вне макроса, не определяя ее как глобальную

Ответ 4

Немного изменено из справки и документации SAS.

%macro names(dsid);
  %let dsid=%sysfunc(open(&dsid, i));
  %let num=%sysfunc(attrn(&dsid,nvars));
  %let varlist=;
  %do i=1 %to &num  ;
    %let varlist=&varlist %sysfunc(varname(&dsid, &i));
  %end;
  %let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
  %put varlist=&varlist;
%mend names;

%names(sasuser.class) ;

Затем мы сохраняем регистр и данные о выводе, даже если числовое и символьное символы смешаны.

Ответ 5

Я не уверен, что утверждение Rawfocus о том, что чтение таблиц словарей запрашивает все библиотеки, истинно, если бы вместо этого использовался sashelp.vcolumn, тогда это было бы правдой, этот подход очень медленный и имеет доступ ко всем выделенным библиотекам. (Это можно доказать с помощью опции SAS RTRACE.)

Я придерживаюсь мнения, что запрос sql к словарю. columns является самым быстрым из описанных здесь методов. Очевидно, что макротизированный код работал бы без макроса, но точка макроса здесь я считаю утилитой; поместите код в свою любимую библиотеку макросов, и вам больше не придется об этом думать.