我有一个包含36列姓名的表A。有一个name-id的xwalk文件,我们称它为x。我需要使用xwalk文件x向表A添加36列id。
如果需要,为了提高效率,这里提供了实际的数据/表大小:我的表A有340行,名称都是文本。xwalk表x有700+行,ids都是数字。每次当名称A中的一列与ID匹配时,可以将xwalk子集到较少数量的潜在池中。这样的子集的大小范围是:9到140。
我想我可以做36次左连接,但似乎应该有更有效的方法来做。有什么建议吗?
为简单起见,表A的示例数据代码有4列。
data A;
input name1 $1-5 name2 $7-10 name3 $12-15 name4 $17-20;
datalines;
Harry Mary John Kate
Lee Sam Joel Sky
;
run;
data x;
input name $1-5 id;
datalines;
Harry 1
Marry 2
John 3
Kate 4
Sam 5
Sky 7
Joel 12
Lee 99
;
run;
data want;
input name1 $1-5 name2 $7-10 name3 $12-15 name4 $17-20 id1 id2 id3 id4;
datalines;
Harry Mary John Kate 1 2 3 4
Lee Sam Joel Sky 99 5 12 7
;
run;
发布于 2020-07-15 04:49:33
下面是一个散列对象/数组版本:
data want;
if _n_ = 1 then do;
if 0 then set x;
declare hash x(dataset:"x");
x.DefineKey("name");
x.DefineData("id");
x.DefineDone();
end;
set a;
array nms{4} $ name1-name4;
array ids{4} id1-id4;
do i = 1 to dim(nms);
if x.find(key:nms{i}) = %sysrc(_sok) then ids{i} = id;
else id = .;
end;
drop i id name;
run;
https://stackoverflow.com/questions/62902984
复制相似问题