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

mj0*_*119 6 sas

我想知道是否可以将一个观察中的每个记录与SAS代码连接起来.例如

这是原始数据集

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

   abc   def      ghi .....     xyz
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个变量,它将所有值从1st_name连接到last_name - 如果可能的话,用特定的分隔符分隔.

预期结果

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

   abc   def      ghi .....     xyz     abcdefg...xyz 
Run Code Online (Sandbox Code Playgroud)

当然有一种方法

data name;
  set name;
  length all_name $ 30;
  all_name=1st_name||2nd_name....||last_name;
run;
Run Code Online (Sandbox Code Playgroud)

但是,如果有数百个变量,情况就会变得糟糕.所以问题是如何自动完成,而不必指定变量名,数字等.

期待SAS专家的答案:)

Lau*_*ick 8

下面的代码应该有效.你需要根据自己的情况进行调整.它的作用是创建一个包含所有字符变量的数组.如果名称包含值名称,它将被连接.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;
Run Code Online (Sandbox Code Playgroud)

  • 如果您不需要在每个连接值之间使用" - "分隔符,请更改cat的catx(" - ",all,char_array {i})(all,char_array {i}). (2认同)

cmj*_*hns 7

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

data name;
  length all_name $32767.;
  set name;
  allname=cats(of first_name--last_name);
run;
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个陈旧的答案,但你只是节省了我很多时间在一个相关的问题,我不得不发帖说谢谢! (2认同)