我想知道是否可以将一个观察中的每个记录与SAS代码连接起来。 E.g。
这是原始数据集
1st_name 2nd_name 3rd_name ..... last_name
abc def ghi ..... xyz
现在我想添加一个变量,它将1st_name和last_name之间的所有值连接起来 - 如果可能的话,用特定的分隔符分隔。
预期结果
1st_name 2nd_name 3rd_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专家的答案:)
答案 0 :(得分: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;
答案 1 :(得分:7)
如果连接的变量是有序的,你可以使用带有变量列表的“of”语法(双破折号)来简化代码。
data name;
length all_name $32767.;
set name;
allname=cats(of first_name--last_name);
run;