2016-03-30 5 views
0

Ich habe einen NXN-Datensatz, von dem ich gerne eine Zeile (1XN) ausgeben möchte. Ich muss Prozentsätze in jeder Spalte berechnen. Während ich mich entlang der Säule bewege, verkleinern sich der Zähler und der Nenner immer weiter ab 1 Reihe darunter.Variierende Zeilennummern im SAS-Loop

Daten Ich habe:

Category Month 0 1 2 3 4 5 6 7 8 9 
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13 
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5 
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10 
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11 
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16 
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8 
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13 
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17 
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16 
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17 

Was ich will, ist

Categ_1 100% 99% 94% 87% 82% 79% 76% 76% 78% 87% 

wo für Spalte 1 (dh 100%) = (Gesamt in 0. Monat)/(Gesamt in 0. Monat) wo für Spalte 2 (dh 99%) = (gesamt im 1. Monat - letzte Zeile)/(gesamt im 0. Monat - letzte Zeile) und so weiter ...

Ich habe es in Excel mit einer einfachen OFFSET-Formel gemacht . Es wäre großartig, wenn jemand mir helfen könnte, es in SAS zu programmieren. Ich finde es schwierig, über eine Spalte zu springen, während die zu berücksichtigenden Zeilen ebenfalls variieren.

Vielen Dank im Voraus!

+0

Bitte erläutern Sie, was Sie unten durch die letzte Zeile/eine Zeile bedeuten. (insgesamt im 1. Monat - insgesamt im 2. Monat)? – Jetzler

+0

in Spalte 2 (99%) Was ich will ist = Summe der ersten 9 Zeilen der Spalte 2/Summe der ersten 9 Zeilen der Spalte 1 –

+0

Sie wollen also eine Summe der oberen Diagonalen einer Matrix (dargestellt als SAS-Datensatz) ? Haben Sie SAS/IML lizenziert? – Joe

Antwort

0

Dies gibt die korrekte Ausgabe. Der Trick besteht darin, alle Variablen zu durchlaufen und bei jedem Schritt (Iteration des Datastep) einen weiteren herauszulassen.

DATA in_data ; 
    INPUT Category $ Month $ var_0 - var_9 ; 
    DATALINES; 
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13 
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5 
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10 
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11 
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16 
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8 
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13 
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17 
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16 
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17 

; 

data out_data; 
do until (last.Category); 
    set in_data; 
    format out_0 - out_9 percent.; 
    array in [*] var_0 - var_9; 
    array out [*] out_0 - out_9; 
    by Category; 
    if first.Category then count = 0; 
    count + 1; 
    do i = 1 to dim(in) + 1 - count; 
     out[i] = sum(out[i],in[i]); 
     if dim(in) + 1 - i = count then out[i] = out[i] /out[1]; 
    end; 
end; 
    drop var_: month i count; 
run; 

bearbeiten: Fehler in während der Bearbeitung, bauen nun behoben

+0

Hey, das ist großartig und funktioniert super. –

+0

Was war der Fehler? Es sollte nicht notwendig sein, den Code für mehrere Kategorien zu optimieren, nur für zusätzliche Variablen. Hast du deine Daten nach Kategorie und Monat sortiert? – Jetzler

+0

Es berechnet nur für die erste Kategorie und Ruhe kommen als. –