zmienne łańcuchowe
zmienne łańcuchowe, Mówiąc najprościej, są zmiennymi, które zawierają nie tylko liczby, ale także inne znaki (ewentualnie zmieszane z liczbami). Na przykład europejskie badanie społeczne przechowuje informacje o kraju, w którym respondenci byli badani, w zmiennej cntry
, która zawiera ciągi takie jak „DE”, „ES”,” LT ” itp. Innym często używanym terminem są zmienne „alfanumeryczne”, oczywiście odnoszące się do” alfabetu”, a zatem do liter. Ale w rzeczywistości zmienna łańcuchowa może zawierać znaki takie jak ” \ ” Lub ” – „lub”:”i tak dalej-wszystko, co może produkować klawiatura.
pierwsza sekcja skupi się na temacie przekształcania ciągów znaków w zmienne numeryczne. Druga sekcja przedstawi inne rzeczy, które uznałem za przydatne. Ale przede wszystkim wydam…
Warning
od wersji 14, Stata obsługuje Unicode (UTF-8). Jeśli nie wiesz, co to oznacza – chodzi o to, jak znaki są kodowane cyfrowo na komputerze. (Słyszeliście, że komputery używają bitów, bajtów itp. do reprezentowania informacji. Jeśli wpiszesz i zapiszesz „a”, nie znajdziesz” A „na dysku twardym, ale jakiś kod komputerowy, który zostanie przekształcony w” a ” na ekranie lub na drukarce.) Unicode jest znacznie bardziej uniwersalny niż wcześniejsze kodowania, takie jak ASCII czy ANSII. Pozwala na reprezentowanie ton znaków, w tym wielu z wielu języków, które nie używają znaków, które tutaj widzisz (pochodzących z alfabetu łacińskiego i w większości identycznych do tych z alfabetu łacińskiego), ale raczej cyrylicy, tajskiego lub czegokolwiek innego.
Nie będę tutaj wdawać się w szczegóły, ale chcę tylko ostrzec, że nowe możliwości radzenia sobie ze znakami Unicode nie są tutaj omówione. Zauważ szczególnie, że dla niektórych funkcji łańcuchowych (takich jak substr()
) istnieją obecnie równoważne funkcje do obsługi zwłaszcza znaków Unicode. Funkcje te mają nazwy, które są składnikami u
plus Funkcja konwencjonalna, np. usubstr()
. Zauważ, że tak długo, jak ograniczasz się do znaków z oryginalnego kodu ASCII (coś, czego uczę i głoszę od dziesięcioleci), nie musisz się martwić. Ale w przeciwnym razie, należy pamiętać, że niektóre rzeczy mogą działać inaczej z Stata 14.
na przykład, niemieckie umlaute są reprezentowane inaczej w Stata 13 i Stata 14, a to ma konsekwencje poza wyświetlaniem znaków. Na przykład (niemieckie) słowo für jest ciągiem o długości trzech w Stata 13, ale Długość łańcucha wynosi cztery w Stata 14. Wpływa to również na wyniki funkcji, takich jak strlen()
. Ponieważ strlen()
odnosi się do używanej pamięci (a nie liczby znaków, które pojawiają się na ekranie), wynik strlen(für)
będzie również wynosił 4 w Stata 14 w przeciwieństwie do 3 w Stata 13. Natomiast nowa funkcja ustrlen(für)
daje 3. Innymi słowy, funkcje „ustring” odnoszą się do liczby znaków, jakie wydają się ludzkie oko, a nie do ilości potrzebnej pamięci.
od zmiennych łańcuchowych do liczbowych
mimo że Stata może obsługiwać zmienne łańcuchowe, pod wieloma względami jest jasne, że zmienne numeryczne są preferowane. Co więcej, większość procedur statystycznych po prostu nie akceptuje zmiennych łańcuchowych. Na szczęście Stata oferuje kilka prostych sposobów na konwersję zmiennych łańcuchowych na liczbowe (i odwrotnie).
zmienne”String only”
czasami zmienne string reprezentują propierties. Może to być „Mężczyzna” i ” kobieta „(plus” gej”,” queer ” lub cokolwiek chcesz, nawet jeśli jest to nadal bardzo rzadkie w danych z nauk społecznych). Lub mogą to być kody krajów wymienione we wstępie, to znaczy „DE”, „ES”,” UK”, US ” itp. Jeśli chcesz przekształcić ją w zmienną numeryczną, każda kategoria powinna być reprezentowana przez inną liczbę. Zmiana z string na numeric jest łatwa, z encode
jest komendą do wyboru:
Zakoduj cntry, gen(cntrynum)
przekonwertuje cntry
na zmienną numeryczną, ze znakami z poprzedniej zmiennej łańcuchowej jako etykietami wartości.
jeśli z jakiegoś powodu chcesz przekonwertować zmienną numeryczną na zmienną łańcuchową, możesz użyć funkcji komplementarnej decode
. Nic dziwnego, że Stata wymaga znakowania zmiennej numerycznej; etykiety te będą używane jako łańcuchy znaków do reprezentowania różnych wartości.
liczby „ukryte” jako ciągi znaków
szczególnym przypadkiem są zmienne, w których wartości liczbowe są przechowywane jako zmienna łańcuchowa, w tym przypadki, gdy wartości liczbowe są przechowywane razem z niektórymi (nieistotnymi) znakami. Procedura destring
oferuje sposoby konwersji takiej zmiennej na zmienną numeryczną, pozostawiając oryginalne wartości bez zmian (jeśli składają się tylko z liczb) lub usuwając znaki nie numeryczne.
ogólna forma polecenia to
destring varname(s), options
z co najmniej jedną opcją. Najważniejsze opcje to:
-
generate(newvarnames)
: tworzy nowe zmienne -
replace
: zastępuje starą zmienną(y)) -
ignore("char1" )
: usuwa znaki „char1”, „char2” itd. -
force
: zmienia wszystkie zmienne, które zawierają znaki nie wymienione wforce
na brakujące
nic dziwnego, że Stata oferuje również polecenie tostring
, które działa na odwrót.
transformacje danych dla zmiennych łańcuchowych
to, co następuje, jest dość niejednorodnym zbiorem. W szczególności istnieją dziesiątki funkcji, które odnoszą się do zmiennych łańcuchowych, a ja omówię tylko bardzo mały i arbitralny wybór.
split
split
to polecenie, które działa na zmiennej łańcuchowej. Oczywiście podzieli go na dwie lub więcej części; zrobi to tworząc nowe zmienne, pozostawiając starą zmienną bez zmian. Robi to, jeśli w oryginalnej zmiennej jest coś, co oddziela te części. Domyślnie separator ten jest spacją. Tak więc podział zmiennej zawierającej ” Joe Brady „spowoduje powstanie dwóch nowych zmiennych, jednej zawierającej” Joe”, a drugiej zawierającej”Brady”. Zauważ, że jeśli jest osoba o imieniu „Joe F. Brady” wynik będzie trzy zmienne.
split name
zmienna „nazwa” zostanie podzielona na zmienne „Nazwa1”, „nazwa2” itp., oczywiście pod warunkiem, że zawiera puste miejsca. Liczba nowych zmiennych będzie równa liczbie spacji plus 1.
split name, parse(,)
zmienna „nazwa” zostanie podzielona za pomocą przecinków zamiast spacji jako separatorów. Możesz wskazać kilka separatorów; ponadto separatory mogą składać się z więcej niż jednego znaku.
split lnum, destring
części „lnum”, które faktycznie reprezentują liczby, zostaną zamienione na zmienne numeryczne — ale tylko wtedy, gdy dla danej nowej zmiennej istnieją liczby. Na przykład, jeśli zmienna” lnum „wynosi” 60 30 „dla jednego przypadku i” 50 ab „dla innego, nowa zmienna „lnum1” będzie numeryczna (z wartościami 60 i 50), podczas gdy „lnum2” będzie nadal zmienną łańcuchową (i podczas gdy wartość tej zmiennej będzie wynosić 30 dla pierwszego przypadku, to nadal będzie traktowana jak łańcuch)
split lnum, destring force
wszystkie nowe zmienne będą numeryczne. Jednak za każdym razem, gdy pojawi się nie numeryczna informacja, wartość będzie brakować. Na przykład, jeśli „lnum” jest „60 b30″, wartość” lnum2 ” będzie brakować.
split lnum, destring force ignore(abcd)
wszystkie nowe zmienne będą liczbowe. Wszelkie znaki „a”, „b”, „c” lub ” d ” zostaną usunięte. Tak więc w poprzednim przykładzie „b30 „zostanie zamieniony na” 30″, a wynikiem będzie rzeczywiście zmienna numeryczna.
split lnum, generate(ln)
zmienna „lnum” zostanie podzielona na zmienne „ln1”, „ln2” i tak dalej.
egen with ends ()
ta funkcja wyodrębni jedną „część” ze zmiennej łańcuchowej (w przeciwieństwie do polecenia split, które utworzy tyle nowych zmiennych, ile jest „Części”). To, czym jest część, jest definiowane przez separator. Jak na ironię, domyślnie ends()
wyodrębni pierwszą część (lub head, jak to zostało nazwane w podręczniku Stata). W sumie są trzy możliwości:
egen firstname = ends(name)
spowoduje to wyodrębnienie wszystkiego, co pojawia się w” NAZWA ” przed pierwszym wystąpieniem separatora, który domyślnie jest jednym pustym spacją. Jest to odpowiednik egen firstname = ends(name), head
. Jeśli nie ma separatora, cały łańcuch zawarty w „name” pojawi się ponownie w „firstname”
egen lastname = ends(name), last
spowoduje to wyodrębnienie wszystkiego, co pojawia się w polu” Nazwa ” po ostatnim wystąpieniu separatora. Ponownie, jeśli nie ma separatora, cała zawartość ” name „będzie reprezentowana w”lastname”.
egen endofname = ends(name), tail
spowoduje to wyodrębnienie wszystkiego, co pojawi się w „nazwie” po pierwszym wystąpieniu separatora. Jeśli nie ma separatora, wynikiem będzie pusty łańcuch.
separator może być oznaczony symbolem punct(,)
. Tak więc egen firstname = ends(name) punct(,)
wyodrębni wszystko, co pojawi się w” nazwie ” przed pierwszym wystąpieniem przecinka. Możliwe są inne separatory, w tym te składające się z kilku znaków, ale nie można wskazać kilku separatorów.
strmatch ()
to może być używane razem z generate/replace
. Szuka” słowa”, a dokładniej sekwencji znaków, jak w:
Gen newvar = strmatch(oldvar,”somecharacters”)
zmienna” newvar „będzie miała wartość 1, jeśli” oldvar „składa się z sekwencji”somecharacters”. Jednakże, jeśli po prostu szukasz „somecharacters”, aby pojawić się gdzieś w „oldvar”, możesz użyć
gen newvar = strmatch(oldvar, „*somecharacters*”)
, który będzie szukał „somecharacters”, aby pojawił się gdziekolwiek. Zapisanie
gen newvar = strmatch(oldvar, „*somecharacters”)
spowoduje, że Stata będzie szukać „somecharacters”, które pojawią się na końcu „oldvar”, bez względu na to, ile znaków poprzedza „somecharacters”. Oczywiście można też użyć "somecharacters*"
.