Как сделать двойной цикл для создания списка хранения в SAS? - PullRequest
0 голосов
/ 07 апреля 2019

У меня очень большой набор данных с более чем 1000 столбцами, с именами столбцов, отформатированными так:

WORLDDATA.table2_usa_2017_population
WORLDDATA.table2_japan_2017_gnp

Мне нужно сохранить только подмножество этих параметров для нескольких избранных стран. Я указываю пользовательские списки:

%let list1 = usa canada uk japan southafrica;
%let list2 = population crimerate gnp;

Как мне сделать двойной цикл, например:

param_list = []
for (i in list1) {
  for (j in list2) {
     param_name = WORLDDATA.table2_{list1[i]}_2017_{list2[j]}
     param_list.append(param_name)
  }
}

такой, что я могу использовать param_list в

data final_dataset;
  set WORLDDATA.table2;
  keep {param_list};
run;

Спасибо!

1 Ответ

0 голосов
/ 07 апреля 2019

Ваш исходный набор данных содержит элементов данных country и topic, закодированных в имя столбца ( метаданные ), вам, вероятно, потребуется транспонировать данные для использования в процедуре SASшаги, которые будут использовать операторы, такие как where, by и class.

Proc TRANSPOSE, могут поворачивать данные от широких к высоким, и на выходе будет столбец с именем _NAME_, который можно использоватьв опции where=(where-statement) в наборе выходных данных.Th where-Statement будет выражением регулярного выражения, в котором ваши списки будут определены как чередующиеся (|) элементы в группе (например, (item-1|...|item-N)).Механизм регулярных выражений будет выполнять неявное внешнее соединение, как это делает вложенный цикл в псевдокоде вопроса.Шаблон регулярного выражения будет использовать модификаторы / ix для того, чтобы шаблон был отформатирован для удобочитаемости, который также игнорирует регистр.

Чтобы Proc TRANSPOSE поворачивал каждую строку набора данных, набор данных должениметь ключ строки (переменную или переменные в комбинации), которые отличаются от строки к строке.

Непроверенный пример:

proc transpose data=have_wide out=want_subset_categorical (where=(
  prxmatch("(?ix)/
    table2_
      %sysfunc(translate(&LIST1.,|,%str( ))   (?# list 1 spaces converted to | ors )
    _2017_
      %sysfunc(translate(&LIST2.,|,%str( ))   (?# list 2 spaces converted to | ors )

  /",_name_)
));
  by <row-key>;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...