Stata: Extrahieren von Werten und speichern Sie diese als Skalare (und mehr)
Diese Frage ist ein follow-up-Frage Stata: ersetzen, wenn forvalues. Betrachten Sie diese Daten:
set seed 123456
set obs 5000
g firmid = "firm" + string(_n) /* Observation (firm) id */
g nw = floor(100*runiform()) /* Number of workers in a firm */
g double lat = 39+runiform() /* Latitude in decimal degree of a firm */
g double lon = -76+runiform() /* Longitude in decimal degree of a firm */
Den ersten 10 Beobachtungen:
+--------------------------------------+
| firmid nw lat lon |
|--------------------------------------|
1. | firm1 81 39.915526 -75.505018 |
2. | firm2 35 39.548523 -75.201567 |
3. | firm3 10 39.657866 -75.17988 |
4. | firm4 83 39.957938 -75.898837 |
5. | firm5 56 39.575881 -75.169157 |
6. | firm6 73 39.886184 -75.857255 |
7. | firm7 27 39.33288 -75.724665 |
8. | firm8 75 39.165549 -75.96502 |
9. | firm9 64 39.688819 -75.232764 |
10. | firm10 76 39.012228 -75.166272 |
+--------------------------------------+
Brauche ich zur Berechnung der Entfernungen zwischen Firma 1 und alle anderen Firmen. So, die vincenty Befehl sieht wie folgt aus:
. scalar theLat = 39.915526
. scalar theLon = -75.505018
. vincenty lat lon theLat theLon, hav(distance_km) inkm
Die vincenty-Befehl erstellt die distance_km variable, der die Entfernungen zwischen jeder Beobachtung und fest 1. Hier habe ich manuell kopieren und fügen Sie die beiden zahlen, die sind 39.915526 und -75.505018.
Frage 1: Was ist die syntax, dass Extrakte aus diesen zahlen?
Nun, ich kann halten, Beobachtungen, wo distances_km <= 2. Und,
. egen near_nw_sum = sum(nw)
wird erstellen Sie die Summe der Arbeitnehmer innerhalb von 2 Kilometern der Firma 1. (Oder, die Zusammenbruch Befehl kann den job zu erledigen.)
Frage 2: ich muss dies für alle Unternehmen, und die endgültigen Daten sollte wie folgt Aussehen:
+-----------------------------------------------------------------+
| firmid nw lat lon near_nw_sum |
|-----------------------------------------------------------------|
1. | firm1 81 39.915526 -75.505018 (# workers near firm1) |
2. | firm2 35 39.548523 -75.201567 (# workers near firm2) |
3. | firm3 10 39.657866 -75.17988 (# workers near firm3) |
4. | firm4 83 39.957938 -75.898837 (# workers near firm4) |
5. | firm5 56 39.575881 -75.169157 (# workers near firm5) |
6. | firm6 73 39.886184 -75.857255 (# workers near firm6) |
7. | firm7 27 39.33288 -75.724665 (# workers near firm7) |
8. | firm8 75 39.165549 -75.96502 (# workers near firm8) |
9. | firm9 64 39.688819 -75.232764 (# workers near firm9) |
10. | firm10 76 39.012228 -75.166272 (# workers near firm10) |
+-----------------------------------------------------------------+
Erstellen der near_nw_sum variable ist meine Letzte Ziel. Ich brauche Ihre Hilfe hier für meine schwachen Daten-management-Fähigkeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende ist im Grunde die gleiche Strategie gefunden hier und basiert auf Ihrem "Endziel". Wieder kann es nützlich sein, abhängig von der Größe Ihrer original-dataset.
joinby
erstellt Beobachtungen, so können Sie überschreiten die Stata-Grenze. Allerdings glaube ich, dass es das macht, was Sie wollen.Was es tut, ist die form paarweisen Kombinationen der Unternehmen zu berechnen Entfernungen und Summe Arbeitnehmer von in der Nähe-Firmen. Kein Grund hier zum extrahieren von skalaren gefragt, wie in Frage 1. Auch, keine Notwendigkeit zu erschweren, die variable
firmid
Konvertierung zum string.Den folgenden überwindet das problem der Stata-Begrenzung der Anzahl der Beobachtungen.
Jedoch inefficicent, einige Tests mit
timer
zeigt, dass die meiste Rechenzeit geht in dievincenty
Befehl, die Sie nicht in der Lage zu entkommen. Das folgende ist die Zeit (in Sekunden) für 10.000 Beobachtungen mit einem Intel-Core-i5-Prozessor und einer herkömmlichen Festplatte (nicht SSD). Timer 1 ist die Summe während 2, 3, 4 sind die Komponenten (ca.). Timer 3 entsprichtvincenty
:Natürlich, beachten Sie, dass in beiden codes doppelte Berechnungen von Distanzen vorgenommen werden (z.B. sowohl die Entfernungen zwischen firm1-firm2 und firm2-firm1 berechnet werden) und diese kann Sie wohl vermeiden. So wie es da steht, für 110,000 Beobachtungen es wird eine lange Zeit dauern. Auf der positiven Seite, ich bemerkte, dass diese zweite Einrichtung die Anforderungen sehr wenig RAM im Vergleich zu der gleichen Menge von Beobachtungen in das erste setup. In der Tat, meine 4GB Rechner friert mit der letzteren.
Beachten Sie auch, dass, obwohl ich den gleichen Samen, wie Sie tun, werden die Daten anders, da ich erstellen eine unterschiedliche Anzahl von Beobachtungen (nicht 5000), das macht einen Unterschied in der Variablen-Erstellung.
(By the way, wenn Sie wollten, um den Wert zu speichern als Skalare könnten Sie subscripting:
scalar latitude = lat[1]
).