2016-07-25 31 views
0

Ich bin neu in SAS und bin mir nicht sicher, wie ich jeden Teil des Datensatzes Have_1 durch den Übersetzungsdatensatz (Have_2) ersetzen würde, den ich in SAS importiert habe.Wie würde ich eine Liste in SAS durchlaufen und jedes Stück mit einem importierten Mapping übersetzen/ersetzen?

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

Haben Sie wirklich brauchen, sie zu bekehren? Oder möchten Sie nur, dass sie mit benutzerfreundlicheren Beschreibungen drucken? Wenn letzteres dann so aussieht wie eine perfekte Anwendung für ein FORMAT. – Tom

Antwort

3

Unabhängig davon, ob Sie sie ersetzen möchten, ist es das, was proc format tut in SAS - Wert auf einen anderen Wert zuordnet.

Hier ist, wie Sie das tun könnten. Beachten Sie, dass Sie die ursprünglichen 3 Variablen nicht wiederverwenden können (da sie numerisch sind), aber Sie könnten eine rename und drop Kombination verwenden, wenn Sie wirklich die gleichen Variablennamen wollten.

Mit einer format Anweisung direkt würde auch das gleiche Ergebnis visuell (aber der zugrunde liegende Wert ist immer noch der numerische).

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

Hash-Methode:

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;