Zeichenfolgenvariablen

Zeichenfolgenvariablen sind einfach gesagt Variablen, die nicht nur Zahlen, sondern auch andere Zeichen (möglicherweise gemischt mit Zahlen) enthalten. Zum Beispiel speichert die Europäische Sozialerhebung Informationen über das Land, in dem die Befragten befragt wurden, in der Variablen cntry, die Zeichenfolgen wie „DE“, „ES“, „LT“ usw. enthält. Ein anderer Begriff, der häufig verwendet wird, sind „alphanumerische“ Variablen, die sich offensichtlich auf das „Alphabet“ und damit auf Buchstaben beziehen. Tatsächlich kann eine Zeichenfolgenvariable Zeichen wie „\“ oder „-“ oder „:“ und so weiter — alles, was eine Tastatur produzieren kann.

Der erste Abschnitt konzentriert sich auf das Thema der Umwandlung von Zeichenfolgen in numerische Variablen. Im zweiten Abschnitt werden einige andere Dinge vorgestellt, die ich nützlich fand. Aber zuerst werde ich ein Problem …

Warnung

Ab Version 14 unterstützt Stata Unicode (UTF-8). Wenn Sie nicht wissen, was das bedeutet — es geht darum, wie Zeichen digital auf Ihrem Computer codiert werden. (Sie haben gehört, dass Computer Bits, Bytes und ähnliches verwenden, um Informationen darzustellen. Wenn Sie ein „a“ eingeben und speichern, finden Sie kein „a“ auf Ihrer Festplatte, sondern einen Computercode, der auf Ihrem Bildschirm oder auf dem Drucker in ein „a“ umgewandelt wird.) Unicode ist viel universeller als frühere Codierungen wie ASCII oder ANSII. Es können unzählige Zeichen dargestellt werden, darunter viele aus den zahlreichen Sprachen, die nicht die Zeichen verwenden, die Sie hier sehen (abgeleitet von und in den meisten Teilen identisch mit denen des lateinischen Alphabets), sondern kyrillisch, thailändisch oder was auch immer.

Ich werde hier nicht ins Detail gehen, sondern nur darauf hinweisen, dass die neuen Möglichkeiten, mit Unicode-Zeichen umzugehen, hier nicht behandelt werden. Beachten Sie insbesondere, dass es für einige String-Funktionen (z. B. substr() ) jetzt äquivalente Funktionen für den Umgang mit Unicode-Zeichen gibt. Diese Funktionen haben Namen, die Zusammensetzungen von u plus der konventionellen Funktion sind, z. B. usubstr() . Beachten Sie, dass Sie sich keine Sorgen machen müssen, solange Sie sich auf Zeichen aus dem ursprünglichen ASCII-Code beschränken (etwas, das ich seit Jahrzehnten unterrichte und predige). Beachten Sie jedoch, dass einige Dinge mit Stata 14 möglicherweise anders funktionieren.

Zum Beispiel werden deutsche Umlaute in Stata 13 und Stata 14 unterschiedlich dargestellt, und dies hat Konsequenzen, die über die Anzeige von Zeichen hinausgehen. Als Beispiel ist das (deutsche) Wort für eine Zeichenfolge der Länge drei in Stata 13, aber die Zeichenfolgenlänge ist vier in Stata 14. Dies beeinflusst auch die Ergebnisse von Funktionen wie strlen() . Da sich strlen() auf den verwendeten Speicher bezieht (und nicht auf die Anzahl der Zeichen, wie sie auf dem Bildschirm angezeigt werden), ist das Ergebnis von strlen(für) in Stata 14 ebenfalls 4 im Gegensatz zu 3 in Stata 13. Die neue Funktion ustrlen(für) ergibt dagegen 3. Mit anderen Worten, „ustring“ -Funktionen beziehen sich auf die Anzahl der Zeichen, wie sie dem menschlichen Auge erscheinen, nicht auf die benötigte Speichermenge.

Von String zu numerischen Variablen

Obwohl Stata mit String-Variablen umgehen kann, ist in vielerlei Hinsicht klar, dass numerische Variablen sehr bevorzugt werden. Nicht zuletzt akzeptieren die meisten statistischen Verfahren keine String-Variablen. Glücklicherweise bietet Stata einige einfache Möglichkeiten zum Konvertieren von Zeichenfolgen in numerische Variablen (und umgekehrt).

„Nur Zeichenfolge“ -Variablen

Manchmal stellen Zeichenfolgenvariablen Eigenschaften dar. Dies könnte „männlich“ und „weiblich“ sein (plus „schwul“, „queer“ oder was auch immer Sie wollen, auch wenn dies in sozialwissenschaftlichen Daten immer noch sehr selten ist). Oder es könnten die in der Einleitung genannten Ländercodes sein, dh „DE“, „ES“, „UK“, US“ usw. Wenn Sie dies in eine numerische Variable umwandeln müssen, sollte jede Kategorie durch eine andere Nummer dargestellt werden. Der Wechsel von String zu numerisch ist einfach, wobei encode der Befehl Ihrer Wahl ist:

encode cntry, gen(cntrynum)

konvertiert cntry in eine numerische Variable mit den Zeichen aus der früheren Zeichenfolgenvariablen als Wertebeschriftungen.

Wenn Sie aus irgendeinem Grund eine numerische Variable in eine Zeichenfolgenvariable konvertieren möchten, können Sie die ergänzende Funktion decode . Es überrascht nicht, dass Stata erfordert, dass die numerische Variable beschriftet wird; Diese Beschriftungen werden als Zeichenfolgen verwendet, um die verschiedenen Werte darzustellen.

Zahlen, die als Zeichenfolgen „getarnt“ sind

Ein Sonderfall sind Variablen, in denen numerische Werte als Zeichenfolgenvariable gespeichert werden, einschließlich Fällen, in denen die numerischen Werte zusammen mit einigen (irrelevanten) Zeichen gespeichert werden. Die Prozedur destring bietet Möglichkeiten, eine solche Variable in eine numerische Variable umzuwandeln, wobei die ursprünglichen Werte unverändert bleiben (wenn sie nur aus Zahlen bestehen) oder nicht numerische Zeichen entfernt werden.

Die allgemeine Form des Befehls ist

destring varname(s), options

wobei mindestens eine Option erforderlich ist. Die wichtigsten Optionen sind:

  • generate(newvarnames): erstellt neue Variablen
  • replace: ersetzt die alten Variablen)
  • ignore("char1" ): entfernt die Zeichen „char1“, „char2“ usw.
  • force: ändert alle Variablen, die Zeichen enthalten, die in force nicht erwähnt werden, in fehlende

Es überrascht nicht, dass Stata auch den Befehl tostring bietet, der umgekehrt funktioniert.

Datentransformationen für String-Variablen

Was folgt, ist eine ziemlich heterogene Sammlung. Insbesondere gibt es Dutzende von Funktionen, die sich auf String-Variablen beziehen, und ich werde nur eine sehr kleine und willkürliche Auswahl behandeln.

split

split ist ein Befehl, der an einer Zeichenfolgenvariablen arbeitet. Sehr offensichtlich wird es in zwei oder mehr Teile aufgeteilt; Es wird neue Variablen erstellen, während die alte Variable unverändert bleibt. Dies geschieht, wenn in der ursprünglichen Variablen etwas vorhanden ist, das diese Teile trennt. Standardmäßig ist dieses Trennzeichen ein Leerzeichen. Das Aufteilen einer Variablen, die „Joe Brady“ enthält, führt daher zu zwei neuen Variablen, von denen eine „Joe“ und die andere „Brady“ enthält. Beachten Sie, dass, wenn es eine Person namens „Joe F. Brady“ gibt, das Ergebnis drei Variablen sein wird.

split nameVariable „name“ wird in Variablen „name1“, „name2“ usw. aufgeteilt. vorausgesetzt, es enthält Leerzeichen, natürlich. Die Anzahl der neuen Variablen entspricht der Anzahl der Leerzeichen plus 1.

split name, parse(,)Variable „name“ wird mit Kommas anstelle von Leerzeichen als Trennzeichen geteilt. Sie können mehrere Trennzeichen angeben; Trennzeichen können auch aus mehr als einem Zeichen bestehen.

split lnum, destringTeile von „lnum“, die tatsächlich Zahlen darstellen, werden in numerische Variablen umgewandelt — jedoch nur, wenn für eine bestimmte neue Variable durchgehend Zahlen vorhanden sind. Wenn beispielsweise die Variable „lnum“ für einen Fall „60 30“ und für einen anderen Fall „50 ab“ ist, ist die neue Variable „lnum1“ numerisch (mit den Werten 60 und 50), während „lnum2“ weiterhin eine Zeichenfolgenvariable ist (und während der Wert dieser Variablen für den ersten Fall 30 ist, wird dies weiterhin wie eine Zeichenfolge behandelt)

split lnum, destring force Alle neuen Variablen werden numerisch sein. Wenn jedoch eine nicht numerische Information angezeigt wird, fehlt der Wert. Wenn „lnum“ beispielsweise „60 b30“ ist, fehlt der Wert von „lnum2“.

split lnum, destring force ignore(abcd)Alle neuen Variablen sind numerisch. Alle Zeichen „a“, „b“, „c“ oder „d“ werden gelöscht. So wird im vorherigen Beispiel „b30“ in „30“ umgewandelt und das Ergebnis wird in der Tat eine numerische Variable sein.

split lnum, generate(ln)Die Variable „lnum“ wird in die Variablen „ln1“, „ln2“ usw. aufgeteilt.

egen with ends()

Diese Funktion extrahiert einen „Teil“ aus einer String-Variablen (im Gegensatz zum Split-Befehl, der so viele neue Variablen erstellt, wie „Teile“ vorhanden sind). Was ein Teil ist, wird durch ein Trennzeichen definiert. Ironischerweise extrahiert ends() standardmäßig den ersten Teil (oder Kopf, wie er im Stata-Handbuch genannt wird). Alles in allem gibt es drei Möglichkeiten:

egen firstname = ends(name) Dadurch wird alles extrahiert, was in „name“ vor dem ersten Auftreten des Trennzeichens angezeigt wird. Dies entspricht egen firstname = ends(name), head . Wenn kein Trennzeichen vorhanden ist, wird die gesamte in „name“ enthaltene Zeichenfolge erneut in „Vorname“ angezeigt“

egen lastname = ends(name), last Dadurch wird alles extrahiert, was in „name“ nach dem letzten Auftreten des Trennzeichens angezeigt wird. Wenn kein Trennzeichen vorhanden ist, wird der gesamte Inhalt von „name“ in „lastname“ dargestellt.

egen endofname = ends(name), tailDies extrahiert alles, was in „name“ nach dem ersten Auftreten des Trennzeichens erscheint. Wenn kein Trennzeichen vorhanden ist, ist das Ergebnis eine leere Zeichenfolge.

Das Trennzeichen kann durch punct(,) angezeigt werden. Daher extrahiert egen firstname = ends(name) punct(,) alles, was in „name“ vor dem ersten Auftreten eines Kommas erscheint. Andere Trennzeichen sind möglich, einschließlich solcher, die aus mehreren Zeichen bestehen, aber Sie können nicht mehrere Trennzeichen angeben.

strmatch()

Dies kann zusammen mit generate/replace verwendet werden. Es wird nach einem „Wort“ oder genauer nach einer Zeichenfolge gesucht, wie in:

gen newvar = strmatch(oldvar, „somecharacters“)

Die Variable „newvar“ hat den Wert 1, wenn „oldvar“ aus der Sequenz „somecharacters“ besteht. Wenn Sie jedoch nur nach „somecharacters“ suchen, um irgendwo in „oldvar“ zu erscheinen, können Sie

gen newvar = strmatch(oldvar, „*somecharacters*“)

die nach „somecharacters“ suchen, um irgendwo zu erscheinen. Wenn Sie

gen newvar = strmatch(oldvar, „*somecharacters“)

gen newvar = strmatch(oldvar, „*somecharacters“)

sucht Stata nach „somecharacters“ , die am Ende von „oldvar“ angezeigt werden, unabhängig davon, wie viele Zeichen vor „somecharacters“ stehen. Natürlich kann auch "somecharacters*" verwendet werden.