Strengvariabler

Strengvariabler er simpelthen variabler, der ikke kun indeholder tal, men også andre tegn (muligvis blandet med tal). For eksempel gemmer den europæiske sociale undersøgelse oplysninger om det land, hvor respondenterne blev undersøgt i variabel cntry, som indeholder strenge som “de”, “ES, “LT” osv. Et andet udtryk, der ofte bruges, er “alfanumeriske” variabler, der naturligvis henviser til “alfabetet” og derfor til bogstaver. Men faktisk kan en strengvariabel indeholde tegn som ” \ “eller” – “eller”:”og så videre-alt hvad et tastatur kan producere.

det første afsnit vil fokusere på emnet at omdanne streng til numeriske variabler. Det andet afsnit vil præsentere nogle andre ting, jeg fandt nyttige. Men først og fremmest vil jeg udstede en …

advarsel

fra version 14 understøtter Stata Unicode (UTF-8). Hvis du ikke ved hvad det betyder — handler det om, hvordan tegn kodes digitalt på din computer. (Du har hørt, at computere bruger bits, bytes og sådanne ting til at repræsentere information. Hvis du skriver og gemmer et “A”, finder du ikke et “A” på din harddisk, men en computerkode, der omdannes til et “A” på din skærm eller på printeren.) Unicode er meget mere universel end tidligere kodninger som ASCII eller ANSII. Det gør det muligt at repræsentere masser af tegn, herunder mange fra de mange sprog, der ikke bruger de tegn, du ser her (afledt af og i de fleste dele identiske med dem i det latinske alfabet), men snarere kyrillisk, Thailandsk eller hvad som helst.

jeg vil ikke gå i detaljer her, men vil bare advare dig om, at de nye muligheder for at håndtere Unicode-tegn ikke er dækket her. Bemærk især, at for nogle strengfunktioner (såsom substr()) er der nu tilsvarende funktioner til især at håndtere Unicode-tegn. Disse funktioner har Navne, der er kompositter af u plus den konventionelle funktion, f.eks. usubstr(). Bemærk, at så længe du begrænser dig til tegn fra den oprindelige ASCII-kode (noget jeg har undervist og prædiket i årtier), er der ingen grund til at bekymre dig. Men ellers skal du være opmærksom på, at nogle ting kan fungere anderledes med Stata 14.

for eksempel er tysk umlaute repræsenteret forskelligt i Stata 13 og Stata 14, og dette har konsekvenser ud over visningen af tegn. Som et eksempel er det (tyske) ord f kr en streng af længde Tre i Stata 13, men strenglængden er fire i Stata 14. Dette påvirker også resultaterne af funktioner som strlen(). Da strlen() henviser til den anvendte hukommelse (og ikke antallet af tegn, som de vises på skærmen), vil resultatet af strlen(für) også være 4 i Stata 14 i modsætning til 3 i Stata 13. Den nye funktion ustrlen(für) vil derimod give 3. Med andre ord henviser “ustring” – funktioner til antallet af tegn, som de ser ud for det menneskelige øje, ikke mængden af hukommelse, der er nødvendig.

fra streng til numeriske variabler

selvom Stata kan håndtere strengvariabler, er det klart i mange henseender, at numeriske variabler er meget foretrukne. Ikke mindst accepterer de fleste statistiske procedurer bare ikke strengvariabler. Heldigvis tilbyder Stata nogle nemme måder at konvertere streng til numeriske variabler (og omvendt).

“kun streng” variabler

sommetider repræsenterer strengvariabler propierties. Dette kan være “Mand” og “kvinde” (plus “homoseksuel”, “underlig” eller hvad du vil, selvom dette stadig er meget sjældent i samfundsvidenskabelige data). Eller det kan være de landekoder, der er nævnt i introduktionen, det vil sige “DE”, “ES”, “UK”, USA” osv. Hvis du har brug for at omdanne dette til en numerisk variabel, skal hver kategori repræsenteres af et andet tal. Det er nemt at skifte fra streng til numerisk, idet encode er kommandoen efter eget valg:

encode cntry, gen(cntrynum)

konverterer cntry til en numerisk variabel med tegnene fra den tidligere strengvariabel som værdietiketter.

hvis du af en eller anden grund vil konvertere en numerisk variabel til en strengvariabel, kan du bruge den komplementære funktion decode. Ikke overraskende kræver Stata, at den numeriske variabel skal mærkes; disse etiketter vil blive brugt som strenge til at repræsentere de forskellige værdier.

tal “forklædt” som strenge

et specielt tilfælde er variabler, hvor numeriske værdier gemmes som en strengvariabel, inklusive tilfælde, hvor de numeriske værdier gemmes sammen med nogle (irrelevante) tegn. Procedure destring tilbyder måder at konvertere en sådan variabel til en numerisk variabel, idet de oprindelige værdier forbliver uændrede (hvis de kun består af tal) eller fjerner ikke-numeriske tegn.

kommandoens generelle form er

destring varname(s), indstillinger

med mindst en mulighed påkrævet. De vigtigste muligheder er:

  • generate(newvarnames): opretter nye variabler
  • replace: erstatter den gamle variabel(er)
  • ignore("char1" ): fjerner tegn “char1”, “char2” osv.
  • force: ændrer alle variabler, der indeholder tegn, der ikke er nævnt i force til manglende

ikke overraskende tilbyder Stata også kommando tostring, der fungerer omvendt.

datatransformationer for strengvariabler

det følgende er en ret heterogen samling. Især er der snesevis af funktioner, der henviser til strengvariabler, og jeg vil kun dække et meget lille og vilkårligt valg.

split

split er en kommando, der fungerer på en strengvariabel. Meget åbenlyst vil det opdele det i to eller flere dele; det vil gøre det ved at skabe nye variabler, mens den gamle variabel forbliver uændret. Det gør det, hvis der er noget i den oprindelige variabel, der adskiller disse dele. Som standard er denne separator et mellemrum. Således vil opdeling af en variabel indeholdende “Joe Brady” resultere i to nye variabler, den ene indeholder “Joe” og den anden indeholder “Brady”. Bemærk, at hvis der er en person ved navn “Joe F. Brady”, vil resultatet være tre variabler.

split namevariabel “navn” vil blive opdelt i variabler “name1”, “name2” osv., forudsat at den indeholder emner, selvfølgelig. Antallet af nye variabler vil være lig med antallet af emner plus 1.

split name, parse(,)variabelt “navn” opdeles ved hjælp af kommaer i stedet for emner som separatorer. Du kan angive flere separatorer; separatorer kan også bestå af mere end et tegn.

split lnum, destring dele af “lnum”, der faktisk repræsenterer tal, omdannes til numeriske variabler — men kun hvis der er tal overalt for en given ny variabel. For eksempel, hvis variablen “lnum” er ” 60 30 “for en sag og” 50 ab “for en anden, vil den nye variabel “lnum1” være numerisk (med værdierne 60 og 50), mens “lnum2” stadig vil være en strengvariabel (og mens værdien af denne variabel vil være 30 for det første tilfælde, vil dette stadig blive behandlet som en streng)

split lnum, destring forcealle de nye variabler vil være numeriske. Men når et ikke-numerisk stykke information vises, mangler værdien. For eksempel, hvis” lnum “er” 60 b30″, mangler værdien af” lnum2″.

split lnum, destring force ignore(abcd) alle de nye variabler vil være numeriske. Alle tegn “a”, “b”, “c” eller ” d ” vil blive droppet. Således vil i det foregående eksempel “b30” blive omdannet til “30”, og resultatet vil faktisk være en numerisk variabel.

split lnum, generate(ln)variabel “lnum” vil blive opdelt i variabler “ln1”, “ln2” og så videre.

egen med ender()

denne funktion vil udtrække en “del” fra en strengvariabel (i modsætning til split-kommandoen, som vil skabe så mange nye variabler som der er “dele”). Hvad en del er er defineret af en separator. Ironisk nok vil ends() som standard udtrække den første del (eller hovedet, som det hedder i Stata-håndbogen). Alt i alt er der tre muligheder:

egen firstname = ends(name)dette vil udtrække noget, der vises i” navn ” før den første forekomst af separatoren, som er standard er en tom plads. Dette svarer til egen firstname = ends(name), head. Hvis der ikke er nogen separator, vises hele strengen i “navn” igen i “fornavn”

egen lastname = ends(name), lastdette vil udtrække noget, der vises i” navn ” efter den sidste forekomst af separatoren. Igen, hvis der ikke er nogen separator, vil hele indholdet af “navn” blive repræsenteret i “efternavn”.

egen endofname = ends(name), tail dette vil udtrække noget, der vises i “navn” efter den første forekomst af separatoren. Hvis der ikke er nogen separator, bliver resultatet en tom streng.

separatoren kan angives med punct(,). Således egen firstname = ends(name) punct(,)vil udtrække noget, der vises i “navn” før den første forekomst af et komma. Andre separatorer er mulige, herunder dem, der består af flere tegn, men du kan ikke angive flere separatorer.

strmatch()

dette kan bruges sammen med generate/replace. Det ser efter et “ord”, eller mere præcist, en sekvens af tegn, som i:

gen nyvar = strmatch(oldvar,”somecharacters”)

variabel” nyvar “vil have en værdi på 1, hvis” oldvar “består af sekvensen”somecharacters”. Men hvis du bare leder efter “somecharacters”, der skal vises et eller andet sted i “oldvar”, kan du bruge

gen nyvar = strmatch(oldvar, “*somecharacters*”)

som vil se efter “somecharacters”, der skal vises hvor som helst. Skrivning

gen nyvar = strmatch(oldvar, “*somecharacters”)

får Stata til at se efter “somecharacters”, der vises i slutningen af “oldvar”, uanset hvor mange tegn der går forud for “somecharacters”. Selvfølgelig kan "somecharacters*" også bruges.