In SAS, wie Sie Zusammenbruch mehrere Zeilen in eine Zeile basierend auf einem ID-variable?
Die Daten, die ich arbeite, ist derzeit in der form:
ID Sex Race Drug Dose FillDate
1 M White ziprosidone 100mg 10/01/98
1 M White ziprosidone 100mg 10/15/98
1 M White ziprosidone 100mg 10/29/98
1 M White ambien 20mg 01/07/99
1 M White ambien 20mg 01/14/99
2 F Asian telaprevir 500mg 03/08/92
2 F Asian telaprevir 500mg 03/20/92
2 F Asian telaprevir 500mg 04/01/92
Und ich möchte schreiben von SQL-code, um die Daten in der form von:
ID Sex Race Drug1 DrugDose1 FillDate1_1 FillDate1_2 FillDate1_3 Drug2 DrugDose2 FillDate2_1 FillDate2_2 FillDate2_3
1 M White ziprosidone 100mg 10/01/98 10/15/98 10/29/98 ambien 20mg 01/07/99 01/14/99 null
2 F Asian telaprevir 500mg 03/08/92 03/20/92 04/01/92 null null null null null
Bräuchte ich nur eine Zeile für jede eindeutige ID, die mit allen einzigartigen Medikament/Dosis/fill-info in Spalten, nicht in Zeilen. Ich vermute, es kann getan werden mit PROC TRANSPOSE, aber ich bin nicht sicher, ob die effizienteste Art und Weise zu tun, die mehrere transponiert. Ich sollte anmerken, dass ich über 50.000 unique-IDs, die jeweils mit unterschiedlichen Mengen der Medikamente, die Dosen und die entsprechenden Termine füllen. Ich würde gerne return null/empty Werte für diese Spalten, die nicht mit Daten zu füllen. Vielen Dank im Voraus.
- Ich würde vorschlagen, diesen Aufsatz zu Lesen: sascommunity.org/wiki/...
- Hmm, das ist ein dupe, Probleme bei der Suche eine gute doppelte Frage Kandidaten obwohl.
- Fand ich ähnliche Beiträge, aber keine, die Adresse das Problem, dass Variablen, die umgesetzt werden muss (Medikament, Dosis, filldate) und brauchen nicht in Nationales Recht umgesetzt werden (Geschlecht, Rasse) in den gleichen Satz. Es scheint, dass es eine effizientere Methode als unsystematisch transponieren geht dann immer und immer wieder..
- möglich, Duplikat der gibt es einen effizienten Weg zur Umsetzung der riesige Tabelle in SAS
- doppelte ordnungsgemäß vorgeschlagen. Einige der Antworten an, dass man kann verallgemeinert werden für die Umsetzung mehrerer Variablen, ohne viel Arbeit.
- Es ist definitiv nicht ein Duplikat dieser Frage, @user667489.
- Ich weiß nicht, dass es eine perfekte Kopie für Sie. Vielleicht sollte jemand eine Vorlage, Transponieren, Frage, Antworten die meisten der möglichen transponieren Probleme zu schließen, Dinge zu.
- es wäre 3 transponiert und zu einem einzigen Zusammenführen oder eine einzelne datastep sobald Sie festgestellt haben, die maximale Anzahl pro Arzneimittel pro ID.
- Minus, die Letzte Antwort, die Sie haben eine seltsame Struktur, die eigentlich schwer zu verwenden, weiter auf. In der Tat, ich bin mir zu 99% sicher, dass exakt diese Frage wurde auf communities.sas.com aber es nicht eine Antwort gibt. Ich würde empfehlen, gegen diese Daten-Struktur, die durch die Art und Weise, wie es zu verwenden, müssen Sie eine Menge von manuellen oder makro Programmieren.
- vielen Dank für bemerken, dass diese Frage tatsächlich sehr wichtig, Unterschiede von denen anderer transponieren Beiträge, das ist eigentlich, wo der Wert in dieser Frage ist: die Feinheiten
- vielen Dank für das feedback. Würden Sie mir sagen, ein wenig mehr darüber, warum Sie empfehlen, gegen diese Datenstruktur? Ich don ' T nicht einverstanden mit Ihnen, ich bin nur neugierig, wie ich möchte, um zu vermeiden, potenziell unnötige manuelle/Makros Codierung downstream
- Allgemeine Fragen, die mit Drogen-Daten: wie viele Menschen nahmen X, X&Y, X Z Dauer, X für K Länge der Zeit, die sind leichter zu beantworten, in der aktuellen form. Sie können keine arrays verwenden, um eine Schleife über das Medikament Beträge, es sei denn, Sie erklären, dass ein für jedes Medikament/Menge combo. Die verwenden Sie nur für die aktuelle form ist einfache Anzeige.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gewissem Maße die gewünschte Effizienz dieser bestimmt die beste Lösung.
Zum Beispiel, vorausgesetzt, Sie wissen, die maximale sinnvolle Anzahl von fill-Daten, könnten Sie Folgendes verwenden, um sehr schnell eine transponierte Tabelle - wahrscheinlich der Schnellste Weg, das zu tun - aber um den Preis, dass eine große Menge von post-processing, wie es ausgegeben wird eine Menge von Daten, die Sie nicht wirklich wollen.
Auf der anderen Seite der Dinge, die vertikale-und-Transposition ist die "beste" Lösung in Bezug auf die nicht erfordert zusätzliche Schritte; obwohl es möglicherweise langsam.
Es ist nicht verrückt langsam, wirklich, und Chancen sind, es ist gut für Ihre 50k-IDs (obwohl Sie nicht sagen wie viele Drogen). 1 oder 2 GB Daten funktioniert Prima hier, vor allem, wenn Sie nicht brauchen, um Sie zu Sortieren.
Schließlich gibt es einige andere Lösungen, die sind in zwischen. Sie konnten den transpose ganz mit arrays in die Daten Schritt für einen, der vielleicht der beste Kompromiss; Sie haben, im Voraus zu bestimmen, die maximale Schranken für die arrays, aber das ist nicht das Ende der Welt.
Es hängt alles von Ihren Daten, aber das ist wirklich das beste. Ich würde wahrscheinlich versuchen, die Daten Schritt/transpose ersten: das ist die einfachste, und die meisten anderen Programmierer gesehen haben, so ist es wahrscheinlich die beste Lösung, es sei denn, es ist extrem langsam.
Betrachten Sie die folgende Abfrage mit zwei abgeleiteten Tabellen, die (inneren und äußeren) feststellt, daß eine ordinale Zeilenanzahl von der
FillDate
um. Dann, mit der Zeile zu zählen, wenn/dann oder Fall/wenn die Logik wird verwendet für die Spalten iteriert. Äußeren Abfrage hat die max-Werte gruppiert nachid
,sex
,race
.Die einzige Einschränkung ist das wissen Voraus, wie viele erwartet oder max Anzahl der Zeilen pro ID (D. H., eine weitere Abfrage ist unser Tisch Blättern). Daher füllen in Ellipsen (
...
), wie gebraucht. Bitte beachten Sie, missings generieren wird für Spalten, die nicht zu einer bestimmten ID. Und natürlich stellen Sie bitte die tatsächliche dataset-Namen.Hier ist mein Versuch, eine array-basierte Lösung:
Den data-Schritt-code für die Berechnung der array-Grenzen, ist wahrscheinlich effizienter als SQL-version, aber es ist auch etwas Ausführlicher.
Auf dem anderen hand, mit der SQL-version müssen Sie auch trim whitespace von der makro-vars. Behoben - vielen Dank Tom!Die zur Umsetzung der Daten Schritt ist wahrscheinlich auch auf die effizientere Ende der Skala im Vergleich zu den
proc transpose
/proc sql
Optionen in den anderen Antworten, da macht es nur 1 weiterer Durchlauf durch den Datenbestand, aber wieder, es ist auch ziemlich Komplex.into :X trimmed
oderinto :X separated by ' '