我如何遍历SAS中的列表并使用导入的映射翻译/替换每个片段?

时间:2016-07-25 14:01:29

标签: sql dictionary sas mapping

我是SAS的新手,我不知道如何用我导入SAS的翻译数据集(Have_2)替换数据集Have_1的每个部分。

 Data Have_1
    1111 1234 2222
    2938 3849
    1234 9388
    ...
    2222 2222


  Data Have_2
    1111 a
    1234 b
    2222 c
    2938 d
    3849 e
    ...
    9388 f

 Data Want
    a b c
    d e
    b f
    c c

2 个答案:

答案 0 :(得分:3)

无论您是否要替换它们,这都是proc format在SAS中的作用 - 将值映射到另一个值。

以下是您可能会这样做的方式。请注意,您无法重复使用原始的3个变量(因为它们是数字),但如果您真的想要相同的变量名,则可以执行renamedrop组合。

直接使用format语句也可以直观地获得相同的结果(但基础值仍然是数值)。

Data Have_1;
  infile datalines missover;
  input var1-var3;
datalines;
1111 1234 2222
2938 3849
1234 9388
2222 2222
;;;;
run;



Data Have_2;
  input numval charval $;
datalines;
1111 a
1234 b
2222 c
2938 d
3849 e
9388 f
;;;;
run;

data for_Fmt;
  set have_2;
  start=numval;
  label=charval; *could use rename for these but it makes the last bit more confusing to read;
  retain fmtname 'CHARVALF' type 'N';
  output;

  if _n_=1 then do;  *now define the 'other' value (hlo='o') for non-matched records;
    hlo='o';
    label=' ';
    call missing(start); *unnecessary but avoids duplicate start values and less confusing output;
    output;
  end;
run;

proc format cntlin=for_fmt;
quit;

data want;
  set have_1;
  format var1-var3 CHARVALF1.;   *option 1 - visual format only;
  array var[3];
  array varc[3] $;               *option 2 - new set of vars w/char vals;
  do _i = 1 to dim(Var);
    varc[_i] = put(var[_i],CHARVALF1.);
  end;
run;

答案 1 :(得分:1)

哈希方法:

data want;
if 0 then set have_2;
if _n_=1 then do;
declare hash h(dataset:'have_2');
h.definekey('numval');
h.definedata('charval');
h.definedone();
end;
set have_1;
array var var:;
array new_var (3) $;
do i=1 to dim(var);
if h.find(key:var(i))=0 then new_var(i)=charval;
end;
keep new_var:;
run;