2016-07-14 6 views
0

Bisschen knifflige Frage. Ich brauche eine Methode, um systematisch neue Datenreihen zu gruppieren, zu ordnen und zu erstellen. Es gibt drei 4 Schichtungsebenen (c1, c2, c3, c4) und einen "score" -Wert für jede Iteration der Schichtung. Es ist ein bisschen schwer zu artikulieren, so werde ich Ihnen die HABEN und WÜNSCHEN Tabellen gebenDatentabelle umstrukturieren/neue Zeilen mit leeren Werten eingeben

Hier sind die Datalines-Tabellen für die einfache Handhabung.

data HAVE; 
    input CLASS $ FUR_COLOR $ FAMILY $ SPECIES $ NO_IN_CAPTIVITY; 
    datalines; 
MAMMAL BLACK WHALE KILLER_WHALE 2 
MAMMAL BLACK FELINE PUMA 3 
MAMMAL BLACK APE CHIMP 5 
MAMMAL BLACK APE GORILLA 3 
MAMMAL BLACK APE BONOBO 3 
MAMMAL RED APE ORANGUTAN 2 
; 
RUN; 

data WANT; 
    input C1 $ C2 $ C3 $ C4; 
    datalines; 
MAMMAL . BLACK    . 
MAMMAL WHALE KILLER_WHALE 2 
MAMMAL . BLACK . 
MAMMAL FELINE PUMA 3 
MAMMAL . BLACK . 
MAMMAL APE CHIMP 5 
MAMMAL APE GORILLA 3 
MAMMAL APE BONOBO 3 
MAMMAL . RED . 
MAMMAL APE ORANGUTAN 2 
; 
RUN; 
+1

ich nicht, warum Reihen 'C D G 3' und' C D H 3' nicht über eine 'D'-nur vor ihnen rudern, könnten Sie pls erklären? –

+0

'CDG3' und' CDH3' teilen sich einen 'D'-Wert für' C2'. Sie rollen beide auf "C", das auf "D" aufrollt. Im Gegensatz dazu teilt "CEI2" den "C" -Wert mit den anderen genannten Werten, aber der "C" -Wert rollt auf "E", so dass er im Gegensatz zu den anderen eine neue Zeile erhält. –

+0

Hmm ok ... wenn Sie einen (verbalen oder Pseudo-Code) Algorithmus hätten, wäre es einfacher für uns, Ihnen zu helfen. –

Antwort

1

Wie wäre das?

data want; 
    set have(rename=(C2=C2_in C3=C3_in C4=C4_in SCORE=SCORE_in)); 
    by C2_in C3_in; 
    format C1-C3 $1. SCORE 3.; 

    if first.C2_in or first.C3_in then do; 
    C3 = C3_in; 
    output; 
    end; 

    C2 = C2_in; 
    C3 = C4_in; 
    SCORE = SCORE_in; 
    output; 

    drop C2_in C3_in C3_in C4_in SCORE_in; 
run; 

Resulting dataset

+0

Das scheint zu funktionieren. Wenn das HAVE-Dataset nicht sortiert ist, müssen Sie dies tun, bevor Sie Ihren Code ausführen. Vielen Dank für die Ausdauer Dom.! –

+0

Ja, es muss sortiert werden, sonst erhalten Sie unerwartete Ergebnisse ... Gern geschehen, froh, dass es für Sie arbeitet! –

1

könnten Sie verwenden PROC SQL und UNION ALL wie so:

PROC SQL; 

CREATE TABLE want AS 

    SELECT 
     C1, C2, C4, SCORE 
    FROM 
     have 

    UNION ALL 

    SELECT 
     C1, NULL, C3, NULL 
     /* If your version does not support NULL, use '' */ 
    FROM 
     have; 

QUIT; 

OUTPUT:

enter image description here

+0

Die resultierende Tabelle sieht nicht so aus wie die "Will" -Tabelle des OP ... Außerdem sollte die 2 'NULL' in der Auswahl' '' 'und' .' sein (es sei denn, eine andere SAS-Version akzeptiert 'NULL's?) –

+0

Works on meins - ich nehme an, meine Version akzeptiert 'NULL's ... Vielleicht kannst du erklären, wie es das' will' nicht zurückgibt. Ich poste ein Bild von dem, was ich als Ergebnis bekomme. – Nicarus

+0

Interessant ... Welche SAS-Version verwenden Sie? Ich bin auf Desktop SAS 9.4. Was die Ergebnisse anbelangt, sind sie nicht so geordnet wie in OPs "Wollen", und es gibt 12 Zeilen statt 10. –

Verwandte Themen