我知道我以前做过这件事,应该不难。 。 。但我对如何有效地做到这一点一无所知。
我有两张桌子:
表1
主要ID | 类型ID |
---|---|
1001 | A |
1001 | B |
1001 | C |
1002 | B |
1003 | C |
1004 | A |
1004 | C |
1005 | B |
表2
主要ID | 值A | 值B | 值C |
---|---|---|---|
1001 | 12 | 0.22 | 0.042 |
1002 | 10 | 0.19 | 0.039 |
1003 | 9 | 0.18 | 0.036 |
1004 | 14 | 0.3 | 0.062 |
1005 | 5 | 0.12 | 0.028 |
我想根据表 2 中的值在表 1 中创建一个新字段(值),该值对应于与 PrimaryID 匹配的行中的 TypeID
想要
主要ID | 类型ID | 价值 |
---|---|---|
1001 | A | 12 |
1001 | B | 0.22 |
1001 | C | 0.042 |
1002 | B | 0.19 |
1003 | C | 0.036 |
1004 | A | 14 |
1004 | C | 0.062 |
1005 | B | 0.12 |
提前致谢
只需修复表二,使其成为有用的形式。
首先让我们将您的列表转换为实际数据。
data table1 ;
input primaryID $ TypeID $;
cards;
1001 A
1001 B
1001 C
1002 B
1003 C
1004 A
1004 C
1005 B
;
data table2;
input primaryID $ valueA valueB valueC ;
cards;
1001 12 0.22 0.042
1002 10 0.19 0.039
1003 9 0.18 0.036
1004 14 0.3 0.062
1005 5 0.12 0.028
;
您可以使用 PROC TRANSPOSE 将这些多个变量转换为多个观测值。
proc transpose data=table2 out=tall;
by primaryid;
var value: ;
run;
然后使用简单的数据步骤来梳理类型和名称。
data tall ;
set tall;
length typeid $8;
typeid = substr(_name_,6);
rename col1=value;
run;
现在您可以合并或加入,因为类型可供比较。
proc sql;
create table want as
select a.primaryid, a.typeid, b.value
from table1 a left join tall b
on a.primaryid = b.primaryid and a.typeid = b.typeid
order by 1,2
;
quit;