SAS, сохраняя только столбцы, содержащие определенный символ - PullRequest
1 голос
/ 11 января 2020

Я хотел бы знать, возможно ли выполнить действие, в котором сохраняются только столбцы, содержащие определенный символ.

Например, допустим, у меня есть столбцы: имя, фамилия, пол, возраст. Я хочу оставить только те столбцы, которые начинаются с буквы «s» (фамилия и пол). Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 11 января 2020

Если вы хотите сохранить только те переменные, которые начинаются с s, используйте список префиксов имен operator :.

data want;
   set have(keep=s:);
run;
2 голосов
/ 12 января 2020

Существует несколько вариантов фильтрации имен.

Для префиксов или списков переменных это довольно просто. Для суффиксов или более сложных паттернов он остается более сложным. В общем случае вы можете сокращать списки следующим образом:

_numeric_ : all numeric variables
_character_ : all character variables
_all_  : all variables
prefix1 - prefix# : all variables with the same prefix assuming they're numbered
prefix:  : all variables that start with prefix
firstVar -- lastVar : variables based on location between first and last variable, including the first and last. 
first-numeric-lastVar : variables that are numeric based on location between first and last variable

Для чего-либо более сложного требуется отфильтровать его через список метаданных. SAS в основном хранит некоторые метаданные о каждом наборе данных, чтобы вы могли запрашивать эту информацию для создания своих списков. Данные о столбцах и типах находятся в наборе данных sashelp.vcolumn или dictionary.column.

Чтобы отфильтровать все столбцы со словом mpg, например:

*generate variable list;
proc sql noprint;
select name into :var_list separated by " "
from sashelp.vcolumn

where libname = 'SASHELP' and memname = 'CARS' 
and lowcase(name) like '%mpg%';
quit;

*check log for results;
%put &var_list;

*verification from original table;
proc contents data=sashelp.cars;
run;

*example of usage;
data want;
set sashelp.cars;
keep &var_list;
run;

Некоторые подробности доступны в этом сообщении блога и здесь ( документация) .

1 голос
/ 12 января 2020

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

Этот пример демонстрирует два из многих способов генерации исходного кода.

  • таблица метаданных из целевой таблицы, Proc CONTENTS
  • метаданные процесса, Proc SQL
  • построить исходный код
    • Ожидание списков имен <64K <ul>
    • SQL INTO :<macro-variable> для исходного кода ожидается <64K символов </li>
  • Очень большой списки имен или надежный
    • Макрос, который передает исходный код из таблицы метаданных

Из набора данных с 50 000 переменных выберите столбцы чье имя содержит 2912

data have;
  retain id 'HOOPLA12345' x1-x50000 .;
  stop;
run;

* obtain metadata of target table;
proc contents noprint data=have 
  out=varlist_table
    ( keep=name 
      where= (
        prxmatch('/x.*2912.*/',name)         /* name selection criteria */
      )
    );
run;

* Short lists;    
* construct source code for name list;
proc sql noprint;
  select name into :varlist separated by ' ' from varlist_table;

data want;
  set have (keep=&varlist);  /* apply generated source code */
run;

* Arbitrary or Long lists expected;
%macro stream_column (data=, column=);
  %local dsid index &column;
  %let dsid=%sysfunc(open(&data(keep=&column)));
  %if &dsid %then %do;
    %syscall SET(dsid);
    %do %while (0=%sysfunc(fetch(&dsid)));
      &&&column.  /* emit column value from table */
    %end;
    %let dsid = %sysfunc(close(&dsid));
  %end;
%mend;

options mprint;
data want2;
  set have (keep=
       /* stream source code as macro text emissions */
       %stream_column(data=varlist_table,column=name)
  );
run;
1 голос
/ 11 января 2020

Это возможно. В приведенном ниже коде я создал макропеременную с именем столбцов в таблице. После запуска кода у вас будет название нужного вам столбца.

PROC SQL;
   SELECT 
    NAME
INTO:
    NMVAR /*    SAVE IN MACRO VARIABLE  */
FROM SASHELP.VCOLUMN
WHERE 
    LIBNAME EQ "YOUR LIBNAME" AND /* THE NAME OF LIB MUST BE WRITTEN IN UPPERCASE */
    MEMNAME EQ "YOUR TABLE" AND /* THE NAME OF 'TABLE/DATA SET' MUST BE WRITTEN IN UPPERCASE */
    SUBSTR(NAME,1,1) EQ "S";

RUN;

...