1

我正在寻找一个与 Excel 中的“VLOOKUP”函数一样工作的 SAS 代码。

我有两个表: table_1 有一个 ID 列,其中包含 10 行的其他一些列。Table_2 有两列:ID 和定义,共 50 行。我想在 table_1 中定义一个新变量“Definition”并从 table_2 中查找 ID 值。

除了合并之外,我还没有真正尝试过任何其他方法。但是合并保留了 table_2 中所有额外的 40 个变量,这不是我喜欢的。

谢谢, SE

4

2 回答 2

4

最简单的方法是在您的声明中使用该keep选项。merge

data result;
    merge table_1 (in=a) table_2 (in=b keep=id definition);
    by id;
    if a;
 run;

另一种意味着您不必对数据集进行排序的方法是使用 proc sql。

proc sql;
    create table result as
    select a.*,
           b.definition
    from table_1 a
    left join table_2 b on a.id = b.id;
quit;

最后,如果 table_2 很小,还有哈希表选项:

data result;
    if _n_ = 1 then do;
        declare hash b(dataset:'table_2');
        b.definekey('id');
        b.definedata('definition');
        b.definedone();
        call missing(definition);
    end;
    set table_1;
    b.find();
run;
于 2013-06-26T17:18:27.510 回答
1

这是一种非常有用(而且通常非常快)的方法,专门用于 1:1 匹配,它就是这样VLOOKUP做的。您可以在主表中使用匹配变量和查找结果put或匹配变量创建格式或信息。input

data class_income;
set sashelp.class(keep=name);
income =  ceil(12*ranuni(7));
run;


data for_format;
set class_income end=eof;
retain fmtname 'INCOMEI';
start=name;
label=income;
type='i'; *i=informat numeric, j=informat character, n=format numeric, c=format character;
output;
if eof then do;
 hlo='o'; *hlo contains some flags, o means OTHER for nonmatching records;
 start=' ';
 label=.;
 output;
end;
run;

proc format cntlin=for_format;
quit;

data class;
set sashelp.class;
income = input(name,INCOMEI.);
run;
于 2013-06-26T19:39:52.707 回答