我有一张表格如下:
id sprvsr phone name
2 123 5232 ali
2 128 5458 ali
3 145 7845 oya
3 125 4785 oya
我想在一列上添加相同的id和相同名称,并将sprvsr和phone一起放在一列中,如下所示:
id sprvsr phone name
2 123-128 5232-5458 ali
3 145-125 7845-4785 oya
编辑问题: 还有一个与此问题相关的问题。
我按照你向我展示和工作的方式。谢谢!另一个问题是例如:
sprvsr name
5232-5458 ali
5232-5458 ali
5458-5232 ali
有什么方法可以让它们以相同的顺序排列?
答案 0 :(得分:0)
这是一种方法:
data have;
input id sprvsr $ phone $ name $;
datalines;
2 123 5232 ali
2 128 5458 ali
3 145 7845 oya
3 125 4785 oya
;
run;
data want (drop=lag_sprvsr lag_phone);
format id;
length sprvsr $7 phone $9;
set have;
by id;
lag_sprvsr=lag(sprvsr);
lag_phone=lag(phone);
if lag(id)=id then do;
sprvsr=catx('-',lag_sprvsr,sprvsr);
phone=catx('-',lag_phone,phone);
end;
if last.id then output;
run;
请注意输入变量和连接字符串的长度。输入数据集必须按id排序。
catx()
函数删除前导空格和尾随空格并用分隔符连接。
答案 1 :(得分:0)
如果您需要相同顺序的变量,则需要使用临时数组并对其进行排序。这需要了解您可能拥有多少行。还需要对其进行排序。这比之前的解决方案(在之前的修订版中)要复杂一些。
data have;
input id sprvsr $ phone $ name $;
datalines;
2 123 5232 ali
2 128 5458 ali
3 145 7845 oya
3 125 4785 oya
4 128 5458 ali
4 123 5232 ali
;
run;
data want;
array phones[99] $8 _temporary_; *initialize these two to some reasonably high number;
array sprvsrs[99] $3 _temporary_;
length phone_all sprvsr_all $200; *same;
set have;
by id;
if first.id then do; *for each id, start out clearing the arrays;
call missing(of phones[*] sprvsrs[*]);
_counter=0;
end;
_counter+1; *increment counter;
phones[_counter]=phone; *assign current phone/sprvsr to array elements;
sprvsrs[_counter]=sprvsr;
if last.id then do; *now, create concatenated list and output;
call sortc(of phones[*]); *sort the lists;
call sortc(of sprvsrs[*]);
phone_all = catx('-',of phones[*]); *concatenate them together;
sprvsr_all= catx('-',of sprvsrs[*]);
output;
end;
drop phone sprvsr;
rename
phone_all=phone
sprvsr_all=sprvsr;
run;
构造array[*]
表示"该数组的所有变量"。因此catx('-',of phones[*])
表示将所有phones
元素放入catx中(幸运的是,catx
会忽略遗漏的元素。)