Как выполнить цикл double for для генерации списка сохранений в SAS?

#for-loop #sas

#for-loop #sas

Вопрос:

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

 WORLDDATA.table2_usa_2017_population
WORLDDATA.table2_japan_2017_gnp
  

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

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

Как мне выполнить цикл double for следующим образом:

 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. Шаги передачи данных SAS используют DO циклы, а код макроса SAS использует %DO циклы. Покажите, что вы пробовали.

2. В SAS 9.4 вы также могли бы попробовать PROC LUA

3. Сколько строк в очень большом наборе данных? Чему соответствует каждая строка?

4. WORLDDATA — это имя библиотеки или таблицы? Вы указываете набор данных, но это пахнет как libname.

5. WORLDDATA слишком длинный, чтобы использовать его в качестве ссылки libref, а имена переменных не могут содержать точку.

Ответ №1:

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

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

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

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

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

  /",_name_)
));
  by <row-key>;
run;