2014-07-22 35 views
1

我有一个表如下:来自不同行的数据组合成一个变量

id sprvsr phone name 
2 123 5232 ali 
2 128 5458 ali 
3 145 7845 oya 
3 125 4785 oya 

我想提出同样的ID和相同的名字一列,sprvsr和电话在一列在一起如下:

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

如果您需要相同顺序的变量,则需要使用临时数组并对其进行排序。这需要了解您可能拥有多少行。还要求对它进行排序。这比以前的解决方案稍微复杂一些(在之前的版本中)。

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忽略)。

+1

乔是对的,永远不要相信'lag()'函数! ;) – DaBigNikoladze

+0

谢谢,它正好用这个代码。但是原来没有什么工作是因为我的变数。我有3个变量电子邮件电话和身份证。即使其中一个也不起作用。错误如下所示:错误:变量supervisors_pidm已被定义为字符和数字。 错误:在这种情况下,电子邮件的变量类型无效。 错误:在这种情况下,手机的变量类型无效。 – user3780068

+0

关于主管的错误是你不能混合使用字符和数字,这是基本的SAS 101.其他错误表明你试图以你不应该使用的方式使用数组。它是在我们使用电话的地方吗? – Joe

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; 

只是要注意输入变量的可能lenghts和串联的字符串的。输入数据集必须按ID排序。

catx()函数删除前导和尾随空白并用分隔符连接。

+0

@ user3780068听起来像你的主管变量是数字,这不是你想要的。 – Joe

+0

谢谢!我现在有这个错误:错误:变量supervisors_pidm已被定义为字符和数字。 – user3780068

+0

@ user3780068如果sprvsr是数字,那么将其转换为一个字符串,其中'sprvsr2 = put(sprvsr,8。);' – DaBigNikoladze

相关问题