2017-06-13 4 views
0

Meine erste Zeit Buchung. Ich bin ziemlich neu in SAS-Programmierung (eigentlich alle Programmierung). Das scheint ein einfaches Problem zu sein, kann es aber nicht herausfinden. Ich habe einige Kreuztabellen-Ausgabe und ich versuche, es in Form für die einfache Ausgabe an Tabellen zu bekommen. Ich möchte die erste Beobachtung in einer Gruppe beibehalten, wenn es nur 3 Beobachtungen in dieser Gruppe gibt. Wenn es mehr als 3 Beobachtungen gibt, möchte ich alle Beobachtungen außer der letzten behalten. So zum Beispiel, hier ist was ich habe:Ausgabevariablen innerhalb einer Gruppe nur dann, wenn

Group1 Group2 Percent 
var1 1 0.25 
var1 1 0.75 
var1 1 1 
var1 2 0.4 
var1 2 0.6 
var1 2 1 
var1 3 0.7 
var1 3 0.3 
var1 3 0.6 
var2 1 0.1 
var2 1 0.2 
var2 1 0.4 
var2 1 0.3 
var2 1 1 
var2 2 0.2 
var2 2 0.2 
var2 2 0.2 
var2 2 0.2 
var2 2 1 
var2 3 0.7 
var2 3 0.1 
var2 3 0.05 
var2 3 0.05 
var2 3 0.1 

und hier ist das, was ich in einem neuen Datensatz will

Group1 Group2 Percent 
var1 1 0.25 
var1 2 0.4 
var1 3 0.7 
var2 1 0.1 
var2 1 0.2 
var2 1 0.4 
var2 1 0.3 
var2 2 0.2 
var2 2 0.2 
var2 2 0.2 
var2 2 0.2 
var2 3 0.7 
var2 3 0.1 
var2 3 0.05 
var2 3 0.05 

Hoffentlich, das ist klar, aber bitte lassen Sie mich wissen, wenn mehr Informationen benötigt werden.

+0

Hallo Kate, willkommen in SO und SAS. Um dies zu einer guten Frage zu machen, sollten Sie Code einfügen, der zeigt, was Sie getan haben, um dieses Problem zu lösen. Während wir Code-freie Fragen, die sich über bestimmte Techniken stellen, nicht unbedingt ablehnen, ist eine Frage eher rechenschaftspflichtig, wenn sie Code enthält, um das geeignete Können zu zeigen und zu zeigen, dass Sie etwas unternommen haben und nicht Sie bitten uns, für Sie zu arbeiten. – Joe

+0

Insbesondere - sind Sie mit den Begriffen "first" und "last" in der Gruppenbearbeitung vertraut? Wenn nicht, könnten Sie zuerst nachsehen, und es wird Ihrem Versuch helfen, den ich vermute. – Joe

+0

Wie haben Sie diese Datensätze abgeleitet? Haben Sie einen SAS-Proc verwendet oder sind es die, mit denen Sie beginnen? Wenn es von einem PROC kommt, kann es eine Möglichkeit geben, es direkt zu integrieren und diesen Schritt zu überspringen. – Reeza

Antwort

0

Ich habe es in ein paar Schritten aufgeteilt, um Ihnen zu helfen, die Logik zu sehen und sowohl Datenschritte als auch SQL verwendet zu haben. Im Grunde möchten Sie zählen, wie viele in jeder Gruppe sind und alle Zählungen (die Anzahl innerhalb der Gruppe und die Gesamtzahl) behalten, so dass Sie sie verwenden können, um Ihre endgültige Logik zu machen.

data test; 
    length GROUP1 $5 GROUP2 PERCENT 8; 
    input GROUP1 $ GROUP2 PERCENT; 
    datalines; 
    var1 1 0.25 
    var1 1 0.75 
    var1 1 1 
    var1 2 0.4 
    var1 2 0.6 
    var1 2 1 
    var1 3 0.7 
    var1 3 0.3 
    var1 3 0.6 
    var2 1 0.1 
    var2 1 0.2 
    var2 1 0.4 
    var2 1 0.3 
    var2 1 1 
    var2 2 0.2 
    var2 2 0.2 
    var2 2 0.2 
    var2 2 0.2 
    var2 2 1 
    var2 3 0.7 
    var2 3 0.1 
    var2 3 0.05 
    var2 3 0.05 
    var2 3 0.1 
    ; 
run; 

** count the number of obs per group **; 
data test_ct; set test; 
    by GROUP1 GROUP2; 
    COUNT + 1; 
    if first.GROUP2 then COUNT = 1; 
run; 

** count the total number of obs per group and output on each row **; 
proc sql noprint; 
    create table test_ct_all as 
    select *, count(*) as COUNT_TOTAL 
    from test_ct group by GROUP1,GROUP2 
    order by GROUP1, GROUP2, COUNT; 
quit; 

** logic to keep records **; 
data keep_flags; set test_ct_all; 
    if COUNT=1 and COUNT_TOTAL=3 then KEEP=1; 

    *the last record will have COUNT and COUNT_TOTAL equal; 
    if COUNT_TOTAL > 3 and (COUNT_TOTAL ne COUNT) then KEEP=1; 
run; 

** output only the keep records **; 
data keepers; set keep_flags; 
    if KEEP=1; 
run; 
+0

Vielen Dank! Das sieht perfekt aus. Ich hatte mich durch die Anzahl der Beobachtungen pro Gruppe gekämpft, aber danach aufgehängt. Ich schätze deine Hilfe sehr. –

+0

Kein Problem! Bitte upvote die Antwort, wenn es für Sie funktioniert, um andere wissen zu lassen, dass es auch beantwortet worden ist! – Foxer

Verwandte Themen