如何在SAS中连接一个观察中的每条记录

如何在SAS中连接一个观察中的每条记录,sas,Sas,我想知道是否有可能用SAS代码将一次观测中的每条记录连接起来。 例如 这是原始数据集 第一名第二名第三名……姓 abc def ghi ..... xyz abc def ghi ..... xyz abcdefg...xyz 现在我想添加一个变量,该变量将从first_name到last_name的所有值连接起来——如果可能的话,用一个特定的分隔符分隔 预期结果 第一名第二名第三名……姓所有名 abc def

我想知道是否有可能用SAS代码将一次观测中的每条记录连接起来。 例如

这是原始数据集

第一名第二名第三名……姓

   abc   def      ghi .....     xyz
   abc   def      ghi .....     xyz     abcdefg...xyz 
现在我想添加一个变量,该变量将从first_name到last_name的所有值连接起来——如果可能的话,用一个特定的分隔符分隔

预期结果

第一名第二名第三名……姓所有名

   abc   def      ghi .....     xyz
   abc   def      ghi .....     xyz     abcdefg...xyz 
当然有一种方法

data name;
  set name;
  length all_name $ 30;
  all_name=1st_name||2nd_name....||last_name;
run;
然而,如果有数百个变量,事情就会变得糟糕。因此,问题是如何自动执行,而不必指定变量名、数字等


期待SAS专家的回答:)

下面的代码应该可以工作。你需要根据自己的情况调整它。它所做的是创建一个包含所有字符变量的数组。如果名称包含值名称,则将连接该名称。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;

如果要连接的变量是有序的,则可以使用带有变量列表(双破折号)的“of”语法来简化代码

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

+1这是一个很好的答案、很好的解释和一个优雅、通用的解决方案。我喜欢你在这里,劳伦特!如果您不需要在每个连接的值之间使用“-”分隔符,请更改cats(all,char_数组{i})的catx(“-”,all,char_数组{i})。再次感谢您,Laurent。我同意青蛙的观点,因为它确实很有用。干杯!这可能是一个老生常谈的答案,但你在一个相关问题上为我节省了太多时间,以至于我不得不发帖表示感谢!我用这段代码来连接,效果很好,但是如何在这段代码的名字和姓氏之间插入逗号?@SQUISH-相关的catx()函数允许您在连接中包含一个分隔符-但是这个分隔符将添加到所有元素之间。不确定这是否是你需要的,但可能值得一看。