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

Интересно, возможно ли объединить каждую запись в одном наблюдении с кодом SAS.Например,

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

1st_name 2nd_name 3rd_name ..... last_name

   abc   def      ghi .....     xyz

Теперь я хочу добавить переменнуюкоторый объединяет все значения от 1st_name до last_name - по возможности, через определенный разделительlast_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 ]

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

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

data concatnames (drop=i);
 * maximum field length, will contain concatenated names;
 attrib all length=$32767.;
 * 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;
7 голосов
/ 28 марта 2011

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

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