我是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
答案 0 :(得分:3)
无论您是否要替换它们,这都是proc format
在SAS中的作用 - 将值映射到另一个值。
以下是您可能会这样做的方式。请注意,您无法重复使用原始的3个变量(因为它们是数字),但如果您真的想要相同的变量名,则可以执行rename
和drop
组合。
直接使用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;