Как прочитать имена переменных в наборе данных SAS? - PullRequest
13 голосов
/ 21 марта 2011

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

Например:

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

Name age sex

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

    Var_name_of_dataset1

    Name
    age
    sex
    

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

Спасибо

Ответы [ 5 ]

25 голосов
/ 21 марта 2011

PROC CONTENTS - самый быстрый способ получить эту информацию в наборе данных. Имена столбцов можно найти в столбце NAME.

proc contents data=sashelp.class out=contents noprint;
run;
20 голосов
/ 21 марта 2011

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

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 ;
7 голосов
/ 07 сентября 2012
%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 позволяет избежать проблем с передачей имени набора данных в неправильном регистре.Требуется глобальный оператор, поскольку созданная макропеременная не обязательно будет доступна вне макроса, не определяя его как глобальный

3 голосов
/ 07 февраля 2017

Немного изменено из справки и документации 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) ;

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

0 голосов
/ 09 июня 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...