同一 table 中的 SAS Vlookup
SAS Vlookup in the same table
我的案例是在同一个 table 中寻找价值(对于来自 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;
下面的代码应该适用于您的场景。我已经检查了几个边缘案例场景并且它按预期工作。只要再次检查它是否失败了除此
之外的任何边缘情况
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
;
所以您想获取 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 对象。您可以将 variable/Value 对加载到散列中,然后使用 FIND() 方法检查与 Variable2 关联的值。如果找到,则将该值复制到一个新变量中。请注意,您随后需要重新查找与 VARIABLE 关联的值,因为之前的 FIND() 将覆盖 VALUE。
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;
我的案例是在同一个 table 中寻找价值(对于来自 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;
下面的代码应该适用于您的场景。我已经检查了几个边缘案例场景并且它按预期工作。只要再次检查它是否失败了除此
之外的任何边缘情况 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
;
所以您想获取 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 对象。您可以将 variable/Value 对加载到散列中,然后使用 FIND() 方法检查与 Variable2 关联的值。如果找到,则将该值复制到一个新变量中。请注意,您随后需要重新查找与 VARIABLE 关联的值,因为之前的 FIND() 将覆盖 VALUE。
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;