strängvariabler

strängvariabler är helt enkelt variabler som inte bara innehåller siffror utan också andra tecken (eventuellt blandade med siffror). Till exempel lagrar den europeiska sociala undersökningen information om det land där respondenterna undersöktes i variabel cntry, som innehåller strängar som ”de”, ”ES, ”LT” etc. En annan term som ofta används är ”alfanumeriska” variabler, uppenbarligen hänvisar till ”alfabetet” och därför till bokstäver. Men faktiskt kan en strängvariabel innehålla tecken som ” \ ”eller” – ”eller”:”och så vidare — allt som ett tangentbord kan producera.

det första avsnittet kommer att fokusera på ämnet att omvandla sträng till numeriska variabler. Det andra avsnittet kommer att presentera några andra saker som jag tyckte var användbara. Men först och främst kommer jag att utfärda en …

Varning

från och med version 14 stöder Stata Unicode (UTF-8). Om du inte vet vad det betyder — handlar det om hur tecken kodas digitalt på din dator. (Du har hört att datorer använder bitar, byte och sådana saker för att representera information. Om du skriver och sparar ett ”a” hittar du inte ett ”a” på hårddisken, utan någon datorkod som omvandlas till ett ”a” på skärmen eller på skrivaren.) Unicode är mycket mer universellt än tidigare kodningar som ASCII eller ANSII. Det gör att massor av tecken kan representeras, inklusive många från de många språk som inte använder de tecken du ser här (härledda från och i de flesta delar identiska med det latinska alfabetet), utan snarare kyrilliska, Thailändska eller vad som helst.

jag kommer inte att gå in i detalj här, men vill bara varna dig om att de nya möjligheterna att hantera Unicode-tecken inte täcks här. Observera särskilt att för vissa strängfunktioner (till exempel substr()) finns det nu likvärdiga funktioner för att hantera särskilt Unicode-tecken. Dessa funktioner har namn som är kompositer av uplus den konventionella funktionen, t.ex. usubstr(). Observera att så länge du begränsar dig till tecken från den ursprungliga ASCII-koden (något jag har undervisat och predikat i årtionden), behöver du inte oroa dig. Men annars, var medveten om att vissa saker kan fungera annorlunda med Stata 14.

till exempel är tyska umlaute representerade annorlunda i Stata 13 och Stata 14, och detta har konsekvenser utöver visning av tecken. Som ett exempel är det (tyska) ordet f askorr en sträng av längd tre i Stata 13, Men stränglängden är fyra i Stata 14. Detta påverkar också resultaten av funktioner som strlen(). Eftersom strlen() hänvisar till det använda minnet (och inte antalet tecken som de visas på skärmen) kommer resultatet av strlen(für) också att vara 4 i Stata 14 i motsats till 3 i Stata 13. Den nya funktionen ustrlen(für) ger däremot 3. Med andra ord, ”ustring” – funktioner hänvisar till antalet tecken som de verkar för det mänskliga ögat, inte mängden minne som behövs.

från sträng till numeriska variabler

även om Stata kan hantera strängvariabler är det tydligt i många avseenden att numeriska variabler är mycket föredragna. Inte minst, de flesta statistiska procedurer accepterar bara inte strängvariabler. Lyckligtvis erbjuder Stata några enkla sätt att konvertera sträng till numeriska variabler (och vice versa).

”endast sträng” variabler

ibland representerar strängvariabler propiertier. Det här kan vara ”Man” och ”kvinna” (plus ”gay”, ”queer” eller vad du vill, även om det fortfarande är mycket sällsynt i samhällsvetenskapliga data). Eller det kan vara de landskoder som nämns i introduktionen, det vill säga ”DE”, ”ES”, ”UK”, US” etc. Om du behöver omvandla detta till en numerisk variabel ska varje kategori representeras av ett annat nummer. Att byta från sträng till numerisk är enkelt, med encode som kommandot du väljer:

koda cntry, gen (cntrynum)

konverterar cntry till en numerisk variabel, med tecknen från den tidigare strängvariabeln som värdeetiketter.

om du av någon anledning vill konvertera en numerisk variabel till en strängvariabel kan du använda komplementfunktionen decode. Inte överraskande kräver Stata att den numeriska variabeln ska märkas; dessa etiketter kommer att användas som strängar för att representera de olika värdena.

siffror ”förklädda” som strängar

ett specialfall är variabler där numeriska värden lagras som en strängvariabel, inklusive fall när de numeriska värdena lagras tillsammans med vissa (irrelevanta) tecken. Procedur destring erbjuder sätt att konvertera en sådan variabel till en numerisk variabel, lämnar de ursprungliga värdena oförändrade (om de bara består av siffror) eller tar bort några icke-numeriska tecken.

den allmänna formen av kommandot är

destruering varname(s), alternativ

med minst ett alternativ krävs. De viktigaste alternativen är:

  • generate(newvarnames): skapar nya variabler
  • replace: ersätter den gamla variabeln)
  • ignore("char1" ): tar bort tecken ”char1”, ”char2” etc.
  • force: ändrar alla variabler som innehåller tecken som inte nämns i force till saknas

inte överraskande, Stata erbjuder också kommandot tostring som fungerar tvärtom.

datatransformationer för strängvariabler

det som följer är en ganska heterogen samling. I synnerhet finns det dussintals funktioner som hänvisar till strängvariabler, och jag kommer bara att täcka ett mycket litet och godtyckligt urval.

split

split är ett kommando som fungerar på en strängvariabel. Mycket uppenbart kommer det att dela upp det i två eller flera delar; det kommer att göra det och skapa nya variabler medan den gamla variabeln lämnas oförändrad. Det gör det om det finns något i den ursprungliga variabeln som skiljer dessa delar. Som standard är denna separator ett mellanslag. Således kommer delning av en variabel som innehåller ”Joe Brady” att resultera i två nya variabler, en som innehåller ”Joe” och den andra som innehåller ”Brady”. Observera att om det finns en person som heter ”Joe F. Brady” blir resultatet tre variabler.

split name variabel ”namn” kommer att delas upp i variabler ”namn1”, ”namn2” etc., förutsatt att det innehåller ämnen, förstås. Antalet nya variabler kommer att vara lika med antalet ämnen plus 1.

split name, parse(,)variabel ”namn” kommer att delas med kommatecken istället för tomma som separatorer. Du kan ange flera separatorer; separatorer kan också bestå av mer än ett tecken.

split lnum, destringdelar av ”lnum” som faktiskt representerar siffror kommer att omvandlas till numeriska variabler — men bara om det finns siffror hela tiden för en given ny variabel. Till exempel, om variabeln ”lnum” är ”60 30” för ett fall och ”50 ab” för en annan, kommer den nya variabeln ”lnum1” att vara numerisk (med värdena 60 och 50) medan ”lnum2” fortfarande kommer att vara en strängvariabel (och medan värdet på denna variabel kommer att vara 30 för det första fallet, kommer detta fortfarande att behandlas som en strängvariabel)

split lnum, destring forcealla nya variabler kommer att vara numeriska. Ändå, när en icke-numerisk information visas, kommer värdet att saknas. Till exempel, om” lnum ”är” 60 b30″, kommer värdet av” lnum2 ” att saknas.

split lnum, destring force ignore(abcd)alla nya variabler kommer att vara numeriska. Alla tecken ”a”, ”b”, ”c” eller ” d ” kommer att släppas. Således kommer i det föregående exemplet ”b30” att omvandlas till ”30” och resultatet blir verkligen en numerisk variabel.

split lnum, generate(ln)variabel ” lnum ”kommer att delas upp i variabler” ln1″,” ln2 ” och så vidare.

egen med ändar ()

denna funktion kommer att extrahera en ”del” från en strängvariabel (i motsats till split-kommandot, vilket skapar så många nya variabler som det finns ”delar”). Vad en del är definieras av en separator. Ironiskt nog kommer ends() som standard att extrahera den första delen (eller huvudet, som det heter i Stata-handboken). Sammantaget finns det tre möjligheter:

egen firstname = ends(name)detta kommer att extrahera allt som visas i ”namn” före separatorns första förekomst, vilket är standard är ett tomt utrymme. Detta motsvarar egen firstname = ends(name), head. Om det inte finns någon separator visas hela strängen i ”namn” igen i ”förnamn”

egen lastname = ends(name), lastdetta kommer att extrahera allt som visas i ”namn” efter separatorns sista förekomst. Återigen, om det inte finns någon separator, kommer hela innehållet i ”namn” att representeras i ”efternamn”.

egen endofname = ends(name), tail detta kommer att extrahera allt som visas i ”namn” efter separatorns första förekomst. Om det inte finns någon separator blir resultatet en tom sträng.

separatorn kan anges med punct(,). Således kommer egen firstname = ends(name) punct(,)att extrahera allt som visas i ”namn” före den första förekomsten av ett komma. Andra separatorer är möjliga, inklusive de som består av flera tecken, men du kan inte ange flera separatorer.

strmatch()

detta kan användas tillsammans med generate/replace. Det Letar efter ett” ord”, eller mer exakt, en sekvens av tecken, som i:

gen newvar = strmatch(oldvar,”somecharacters”)

variabel” newvar ”kommer att ha ett värde på 1 om” oldvar ”består av sekvensen”somecharacters”. Men om du bara letar efter ”somecharacters” att visas någonstans i ”oldvar”, kan du använda

gen newvar = strmatch(oldvar, ”*somecharacters*”)

som kommer att leta efter ”somecharacters” att visas någonstans. Skriva

gen newvar = strmatch (oldvar, ”*somecharacters”)

kommer att göra Stata leta efter ”somecharacters” att visas i slutet av ”oldvar”, oavsett hur många tecken föregår ”somecharacters”. Naturligtvis kan "somecharacters*" också användas.