将来自不同行的数据组合成一个变量

时间:2014-07-22 14:07:30

标签: sas

我有一张表格如下:

 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

有什么方法可以让它们以相同的顺序排列?

2 个答案:

答案 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会忽略遗漏的元素。)