2016-06-20 24 views
1

Angenommen, ich habe eine Datensatz D1 wie folgt:SAS für das folgende Szenario

ID ATR1 ATR2 ATR3 
1  23  10  11 
2  22  11  14 
1  19  14  15 
2  34  6  17 
3  10  11  5 

ich ein Datensatz D2 daraus erstellen möchten als

ID ATR1 ATR2 ATR3 
1  23  14  15 
2  34  11  17 
3  10  11  5 

Mit anderen Worten folgt, Der Datensatz D2 besteht aus eindeutigen IDs von D1. Für jede ID in D2 werden die Werte von ATR1-ATR3 als das Maximum (der jeweiligen Variablen) unter den Datensätzen in D1 mit der gleichen ID ausgewählt. Zum Beispiel ID = 1 in D2 hat ATR1 = max (23,19) = 23.

Ich habe eine Lösung, die sehr ungeschickt ist. Ich sortiere einfach dreimal Kopien des Datensatzes "D1" (nach ID und ATR1) und entferne Duplikate. Ich füge später die drei Datensätze zusammen, um zu bekommen, was ich will. Ich denke jedoch, dass es einen eleganten Weg dafür geben könnte. Ich habe etwa 20 solcher Variablen im ursprünglichen Datensatz.

Dank

+2

http://stackoverflow.com/q/37911397/1919583 – Reeza

Antwort

0

PROC SQL-Methode

PROC SQL; 
    CREATE TABLE D2 AS 
    SELECT ID, 
    MAX(ATR1) as ATR1, 
    MAX(ATR2) as ATR2, 
    MAX(ATR3) as ATR3, 
    FROM D1 
    GROUP BY ID; 
QUIT; 

Die GROUP BY Klausel auch GROUP BY 1 geschrieben werden kann, ID weggelassen, da dies in der SELECT Klausel in die erste Spalte bezieht.

PROC ZUSAMMENFASSUNG METHODE

PROC SUMMARY DATA=D1 NWAY; 
      CLASS ID; 
      VAR ATR1 ATR2 ATR3; 
      OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=; 
RUN; 

Hier ist eine Erklärung für einige der Optionen:

  • NWAY - nur die maximale Höhe der summarisation gibt, es ist hier nicht so wichtig, weil Sie nur eine CLASS Variable, dh es gibt nur eine Zusammenfassungsebene. Ohne NWAY erhalten Sie jedoch eine zusätzliche Zeile, die den Maximalwert von ATR1-ATR3 über den gesamten Datensatz anzeigt, was in Ihrer Frage nicht gewünscht ist.

  • DROP=_TYPE_ _FREQ_ - Dies entfernt die automatischen Variablen:

    • _TYPE_ - die das Niveau der summarisation zeigt (siehe obige Bemerkung), die nur eine Spalte wäre, den Wert enthält 1.
    • _FREQ_ - gibt eine Häufigkeitszählung der ID Werte, die, obwohl nützlich, nicht etwas, was Sie in Ihrer Frage wollten.
Verwandte Themen