2017-04-09 2 views
0

Ich habe eine Datenmenge, die wie folgt aussieht:SAS - Transform-Datensatz aus breit zu hoch Verwendung von Arrays

OBS  S1 S2 S3 
before 10 15 13 
after 5 7 8 

Ich versuche Arrays in SAS zu verwenden, um eine Tabelle zu konvertieren, die wie folgt aussieht:

SUBJ BEFORE AFTER 
1  10  5 
2  15  7 
3  13  8 

Ich bin noch neu zu SAS. Ich denke, dass ich brauche eine 2x3-Array einrichten, die die Form hat:

10 15 13 
5 7 8 

dann Schleife obwohl und weisen Sie die Werte.

Das ist, was ich bisher, aber es wird nur die erste Zeile der ursprünglichen Tabelle erfassen:

DATA tall; 
    input obs $ score1-score3; 

    array rowscores(3) score1-score3; 
    array allscores(2,3) _TEMPORARY_; 

    do i=1 to 2; 
    do j=1 to 3; 
     allscores(i,j) = rowscores(j); 
    end; 
    end; 

    do k=1 to 3; 
    subj = k; 
    before = allscores(1,k); 
    after = allscores(2,k); 
    output; 
    end; 

    keep subj before after; 

    DATALINES; 
before 10 15 13 
after 5 7 8 
; 
RUN; 

Was bin ich? Danke für Ihre Hilfe!

+0

SAS verarbeitet nur eine Zeile zu einer Zeit und Arrays sind nur Verknüpfungen zu Variablen. Diese Lösung hängt davon ab, dass Sie die Struktur der Daten kennen. An dieser Stelle können Sie auch den neuen Datensatz eingeben. In diesem Fall ist es wesentlich effizienter, eine PROC TRANSPOSE als eine Array-Methode zu verwenden. – Reeza

Antwort

1

Damit Ihr Datenschritt funktioniert, müssen Sie Ihre INPUT Anweisung in Ihre erste DO-Schleife verschieben.

Um diese Umwandlung auf diese Weise durchzuführen, müssen Sie eine Menge über die Daten wissen, bevor der Datenschritt kompiliert wird. Ich glaube, Sie müssen diese Informationen kennen:

%let ncols=3 ; 
%let nrows=2 ; 
%let have_cols = s1-s3 ; 
%let want_cols = before after ; 

Also, wenn Sie diese Informationen dann wissen hast du den gesamten Datensatz in ein temporäres Array lesen konnte und dann, wenn Sie bis zum Ende erhalten, schreiben sie wieder heraus.

data want ; 
    set have end=eof; 
    array storage (&nrows,&ncols) _temporary_; 
    array cols &have_cols ; 
    do i=1 to &ncols; 
    storage(_n_,i)=cols(i) ; 
    end; 
    if eof then do; 
    do subj=1 to &ncols; 
     do j=1 to &nrows; 
     array want &want_cols ; 
     want(j) = storage(j,subj); 
     end; 
     output; 
    end; 
    end; 
    keep subj &want_cols ; 
run; 

wahrscheinlich viel einfacher, nur PROC TRANSPOSE zu verwenden.

proc transpose data=have out=want ; 
    var s1-s3 ; 
    id obs ; 
run; 

Sie könnten dann die Variable in Ihre SUBJ Variable _NAME_ ändern oder nur eine generieren.

data want; 
    subj+1; 
    set want; 
run; 
+0

Danke. Es sieht so aus als wäre "PROC TRANSPOSE" der richtige Weg. – waealu