我的情况是在同一张表中查找值(对于Value中的Variable2)。你能帮助我吗?在这种情况下,我需要SAS代码。
我试图解决这种问题:
data example2;
input Variable Value Variable2;
datalines;
V1 3 V2
V2 6 V1
V3 4 V5
V4 1 V1
V5 5 V2
;
proc sort data=example2;
by Variable;
run;
data example19;
set example2;
merge example2 example2 (keep=Value Variable2 rename=(Value=new));
run;
答案 0 :(得分:1)
以下代码应适用于您的方案。我已经检查了几个极端情况,并且按预期工作。只需再次检查它是否在其他情况下失败
data have;
input variable $ value variable2 $;
datalines;
V1 3 V2
V2 6 V1
V3 4 V5
V4 1 V1
V5 5 V2
;
proc sql;
create table want as
select a.variable ,a.value, a.variable2 , b.value as value2
from have a
left join
have b
on a.variable2 =b.variable
order by variable;
proc sql;
select * from want;
/* once edge case scenario where you do not have variable for variable2 it
works as expected giving a null value*/
data have1;
input variable $ value variable2 $;
datalines;
V1 3 V2
V2 6 V1
V3 4 V5
V4 1 V1
V5 5 V2
V9 8 V7
;
答案 1 :(得分:1)
因此,您想获取VARIABLE2的值并使用它来查找VARIABLE具有相同值的行吗?因此,要使用MERGE语句来完成此操作,您将需要按VARIABLE2的值进行合并。
因此,首先按VARIABLE2对数据进行排序。
proc sort data=example2;
by Variable2;
run;
然后创建一个仅包含前两列的版本,但对其进行重命名,以使变量名称列匹配,但值列名称不会冲突。
proc sort data=example2 (keep=Value Variable rename=(Value=New Variable=Variable2))
out=example2b
;
by variable2;
run;
现在,您可以只合并两个表。但是,您只想保留原始的行集,因此请使用IN =数据集选项。
data want ;
merge example2(in=in1) example2b;
by variable2;
if in1;
run;
如果要使用更有效的方法,可以使用数据步骤HASH对象进行研究。您可以将变量/值对加载到哈希中,然后使用FIND()方法检查与Variable2相关联的值。如果找到,则将值复制到新变量中。请注意,由于先前的FIND()将覆盖VALUE,因此您需要重新查找与VARIABLE相关的值。
data want ;
set example2;
if _n_=1 then do;
declare hash h(dataset: 'example2');
h.definekey('Variable');
h.definedata('Value');
h.definedone();
end;
if not h.find(key: Variable2) then new=value;
h.find();
run;