2016-08-13 6 views
0

Ich habe Probleme bei der Daten von weiten zu langen Format Umformung:Reshape von breit zu lange ohne Identifier

  1. Ich habe keine ID-Variable für die breiten Variablen.
  2. Mein Datensatz ist ziemlich breit. Ich habe ungefähr 7000 Variablen.
  3. Die Anzahl der Variablen pro ID ist nicht konstant, daher habe ich für einige IDs 5 und für andere habe ich 10 Variablen.

Ich hatte gehofft, dass dies Stata FAQ könnte mir helfen, aber das funktioniert leider nicht richtig (siehe folgende Code-Schnipsel).

So habe ich Daten, die wie im folgenden Beispiel aussieht:

clear 
input str45 Year 
"2010" 
"2011" 
"2012" 
"2014" 
end 
input str45 A101Meas0010 
"1.50" 
"1.70" 
"1.71" 
"1.71" 
input str45 A101Meas0020 
"50" 
"60" 
"65" 
"64" 
input str45 A101Meas0020A 
"51" 
"62" 
"64" 
"68" 
input str45 FE123Meas0010 
"1.60" 
"1.75" 
"1.92" 
"1.94" 
input str45 FE123Meas0020 
"60" 
"72" 
"88" 
"92" 
list 

    +-------------------------------------------------------------+ 
    | Year A10~0010 A10~0020 A1~0020A FE1~0010 FE1~0020 | 
    |-------------------------------------------------------------| 
    1. | 2010  1.50   50   51  1.60   60 | 
    2. | 2011  1.70   60   62  1.75   72 | 
    3. | 2012  1.71   65   64  1.92   88 | 
    4. | 2014  1.71   64   68  1.94   92 | 
    +-------------------------------------------------------------+ 

Der Final Table ich so etwas wie dies aussehen würde, erreichen wollen:

 +--------------------------------------------------+ 
    | Year   ID Meas0010 Meas0020 Meas0020A | 
    |--------------------------------------------------| 
    1. | 2010  A101  1.50   50   . | 
    2. | 2010  FE123  1.60   51   60 | 
    3. | 2011  A101  1.70   60   . | 
    4. | 2011  FE123  1.75   62   72 | 
    5. | 2012  A101  1.71   65   . | 
    6. | 2012  FE123  1.92   64   88 | 
    7. | 2014  A101  1.71   64   . | 
    8. | 2014  FE123  1.94   68   92 | 
    +--------------------------------------------------+ 

Ich habe versucht folgende Code-Schnipsel der Nähe von das Beispiel aus der Stata FAQ, aber das wirft einen Fehler:

Irgendwelche Ideen h Um dies neu zu gestalten? Ich musste nie zuvor solch eine seltsame Struktur umgestalten.

Zusätzliche Frage: Im obigen Beispiel musste ich die Measurement-Names Meas0010, Meas0020 und Meas0020A angeben. Ist es möglich, dies auch zu automatisieren? Alle Messungsnamen beginnen mit dem Schlüsselwort Meas, so dass die Variablennamen immer der Struktur _ID + MeasName, z. A101Meas0020A steht für ID A101 und Messung Meas0020A.

Das Ärgerliche ist: Ich weiß, wie man das in MATLAB macht, aber ich bin gezwungen Stata hier zu verwenden.

+0

Es ist am besten, negative Kommentare zu jeder Software zu vermeiden, wenn Sie Hilfe dazu benötigen, selbst wenn Sie sie humorvoll vorhaben. –

+0

Cross-posted auf http://www.statalism.org/forums/forum/general-stata-discussion/general/1353074-reshape-from-wide-to-long-without-identifier-and-variable-number-of -stubs Leute über Cross-Posting zu informieren, ist in jedem Forum höflich. –

+0

Vergessen zu erwähnen, die Cross-Post ist meine Schuld. Das tut mir leid.Aber ich habe in meinem Beitrag keineswegs über Stata gesprochen und akzeptiere daher nicht den Hinweis auf die erwähnte Kritik. Ich bin 100% fließend in MATLAB und hätte das in wenigen Minuten lösen können. Da ich in diesem Projekt keinen Zugriff auf eine MATLAB-Lizenz habe, muss ich das mit Stata lösen - eine Software, mit der ich noch nicht vertraut bin (und die ich 3 Stunden ohne Fortschritt brauchte). Verstehen Sie mich bitte nicht falsch - für bestimmte Anwendungen, an denen ich hier arbeite, gehört Stata zu den besten Tools. – EliteTUM

Antwort

1

Die Struktur Ihres Variablennamens ist etwas umständlich, aber es gibt eine passende Syntax. Es ist besser in der Hilfe für reshape abgedeckt, und wird nur kaum erwähnt in der FAQ Sie zitieren (was ich geschrieben habe, so kann ich nachdrücklich sein, dass es als Ergänzung zur Hilfe gedacht ist, nicht die erste Zeile der Dokumentation).

Ihr Beispiel Ausbeuten

clear 
input str4 (Year A101Meas0010 A101Meas0020 A101Meas0020A FE123Meas0010 FE123Meas0020) 
"2010" "1.50" "50" "51" "1.60" "50" 
"2011" "1.70" "60" "62" "1.75" "60" 
"2012" "1.71" "65" "64" "1.92" "65" 
"2014" "1.71" "64" "68" "1.94" "64" 
end 
reshape long @Meas0010 @Meas0020 @Meas0020A, i(Year) j(ID) string 
destring, replace 
sort Year ID 
list, sepby(Year) 


    +-----------------------------------------------+ 
    | Year  ID Meas0010 Meas0020 Me~0020A | 
    |-----------------------------------------------| 
    1. | 2010 A101  1.5   50   51 | 
    2. | 2010 FE123  1.6   50   . | 
    |-----------------------------------------------| 
    3. | 2011 A101  1.7   60   62 | 
    4. | 2011 FE123  1.75   60   . | 
    |-----------------------------------------------| 
    5. | 2012 A101  1.71   65   64 | 
    6. | 2012 FE123  1.92   65   . | 
    |-----------------------------------------------| 
    7. | 2014 A101  1.71   64   68 | 
    8. | 2014 FE123  1.94   64   . | 
    +-----------------------------------------------+ 

Es scheint seltsam, dass Ihr Beispiel alles als String eingibt: beachten Sie die destring in meinem Code.

Ohne Zugriff auf Ihr Dataset würde ich sagen, dass Sie in der Lage sein sollten, die allgemeinere Syntax ohne Automatisierung zu finden. Sie wissen, dass es höchstens 10 Messungen im vollsten Fall gibt. In jedem Fall zeigen Sie bereits die Syntax-Tricks an, die Sie zum Entfernen von Strings benötigen, die Sie nicht benötigen.

+0

Diese Lösung ist peinlich einfach und elegant. Vielen Dank, Nick! Der Datensatz wurde aus einer Excel-Tabelle importiert und enthielt einen "wilden" Mischung "aus Doubles und Strings. Für eine korrekte Fehlerbehandlung wollte ich vor dem Destrigen nach Fehlermeldungen suchen. – EliteTUM