как объединить каждую запись в рамках одного наблюдения в SAS

интересно, можно ли объединить каждую запись в пределах одного наблюдения с кодом SAS. Е. Г.

вот исходный набор данных

1st_name 2nd_name 3rd_name .....фамилия

   abc   def      ghi .....     xyz

Теперь я хочу добавить переменную, которая объединяет все значения от 1st_name до last_name -- разделенные определенным разделителем, если это возможно.

ожидаемый результат

1st_name 2nd_name 3rd_name .....all_name фамилия

   abc   def      ghi .....     xyz     abcdefg...xyz 

конечно есть один способ

data name;
  set name;
  length all_name $ 30;
  all_name=1st_name||2nd_name....||last_name;
run;

однако, все будет ужасно, если есть сотни переменных. Поэтому вопрос в том, как это сделать автоматически, без необходимости указывать имена переменных, числа и т. д.

С нетерпением ждем ответов от экспертов SAS:)

2 ответов


код ниже должен работать. Вам нужно настроить его на свою собственную ситуацию. Он создает массив всех символьных переменных. Если имя содержит имя значения, оно будет объединено. Функции catx обрезают значения и используют первый параметр в качестве разделителя. Просто имейте в виду, что максимальный размер поля SAS составляет 32767 символов, поэтому объединение сотен переменных может привести к ошибке.

data concatnames (drop=i);
 * maximum field length, will contain concatenated names;
 attrib all length=767.;
 * read source dataset;
 set names;
 * create array with with character fields;
 array char_array {*} _character_;
 * loop through array;
 do i = 1 to dim(char_array);
  * if fieldname contains name, then add to all with a dash as seperator;
  if (index(vname(char_array{i}),"name") ne 0) then all = catx("-",all,char_array{i});
 end;
run;

если переменные для объединения в порядке, вы можете использовать синтаксис "of" со списком переменных (двойной тире) для упрощения кода.

data name;
  length all_name 767.;
  set name;
  allname=cats(of first_name--last_name);
run;