2016-06-30 5 views
1

Ich habe zwei Datensätze: Formular und Pool mit ähnlicher Tabellenstruktur.Wählen Sie zufällige Beobachtung für jede nach Gruppe in SAS

a) Dataset Form enter image description here

b) Datensatz Pool pool dataset

  • Die beiden oben genannten Datensätze haben drei Spalten, in denen jede Key und Stufe Kombination in Form Dataset haben vier Reihen.

  • Auch Sub-Level- Daten in Form und Pool Daten gegenseitig ausschließende bei Key und Ebene Ebene.

  • Sub-Ebene Werte hat eine besondere Ebene ihnen zugeordneten d.h. Stufe und Sub-Ebene eine Hierarchie folgt.

Ich möchte die Nullwerte unter Sub-Level- Spalte in Formular füllen Datensatz mit Sub-Level- Werte in Pool-Datensatz, wo ein Unterebene in Pool Dataset shoud und Stufe von Form Datensatz gleichen Key gehören.

Wie kann dies in SAS getan werden?

EDIT 1: Nullwerte, die innerhalb jedes einzelne oder einzigartig sein von der Gruppe Schlüssel Ebene in Form Datensatzes gefüllt werden müssen.

+0

Wo die Zufälligkeit Komponente der Fall ist, in beiden genannten dein titel und tag, komm rein? – superfluous

+0

@superfluess: Zufälligkeit kommt in Bild, während Sub_Level aus "Pool" -Datensatz nach dem Zufallsprinzip ausgewählt wird, um Nullwerte in der "Sub-Level" -Spalte in der "Form" -Tabelle aufzufüllen. –

Antwort

1
  1. Erstellen Sie eine neue Zeile ID in form: key, level, new_id.
  2. Zufällige Sortierung pool auf Gruppenebene und die gleiche ID erstellen.
  3. Links beitreten durch key, level, new_id und ersetzen Sie fehlende Werte.

Da es weniger oder gleiche Werte pro Gruppe in form im Vergleich zu pool und alle Werte sind disjunct und einzigartig Sie form ohne Erzeugung von Duplikaten abgeschlossen werden.

Code-Beispiel:

data form; 
    set form; 
    retain new_id; 
    if first.level then new_id = 0; 
    new_id + 1; 
run; 
data pool; 
    set pool; 
    ran_num = ranuni(12345); /* generate random uniform number */ 
run; 
proc sort data=pool; by key level ran_num; run; /* sort by random number */ 
data pool; 
    set pool; 
    retain new_id; 
    if first.level then new_id = 0; 
    new_id + 1; 
run; 
proc sql; 
create table form_full as 
    select a.key, a.level, coalescec(a.sub_level,b.sub_level) as sub_level 
    from form a 
     left join pool b 
     on a.key eq b.key and a.level eq b.level and a.new_id eq b.new_id 
     ; 
quit; 

edit: Bei pool hat weniger Zeilen in einer Gruppe als form, Änderung new_id in form:

data form; 
    set form; 
    retain new_id; 
    if first.level then new_id = 0; 
    if sub_level ne . then new_id + 1; 
run; 
+0

Danke, für Ihre Antwort, aber ich denke, meine Frage früher hat eine andere Einschränkung verpasst, die ich in "EDIT 1" der ursprünglichen Frage aufgenommen habe. Tatsächlich müssen die ersetzten Werte auch innerhalb jeder Gruppe von "Schlüssel" und "Ebene" eindeutig sein. Ich würde es zu schätzen wissen, wenn Sie mit diesem –

+0

helfen könnten, habe ich meine Antwort entsprechend angepasst. – Jetzler

+0

Danke @Jetzler: das hat geholfen !! –