敲黑板,劃重點啦~今天是第三十二個教師節(jié),讓我們先對所有在我們求學(xué)路上給予支持、幫助與鼓勵的老師說聲“教師節(jié)快樂,您辛苦了!”。
今天的推文我們來講一講字符串函數(shù)、正則表達式與變量拆分。我們在把數(shù)據(jù)導(dǎo)入stata中,有時會遇到本來應(yīng)該作為幾個分開的變量,在導(dǎo)入后都跑到了同一列的現(xiàn)象,這時候就需要把這個變量拆分成我們所需要的幾個變量。我們都知道在stata中有一個拆分命令split,這個命令的格式為:
split strvar [if] [in] [, options]
其中常用的options選項為parse(parse_strings),例如要把下圖數(shù)據(jù)中的姓名拆分成firstname和lastname,則命令為:split name,p(“ ”),即以空格把name拆分,然后進行重命名,rename (name1 name2) (firstname lastname),即可得到我們想要的數(shù)據(jù)。
上述命令的使用前提是要有一個統(tǒng)一的分隔符號,例如逗號、空格、分號等特殊符號,那如果我們要拆分的數(shù)據(jù)中并沒有統(tǒng)一的分隔符號時我們又該怎么辦呢?在STATALIST上有人遇到下面這個問題:
我們想把這個數(shù)據(jù)變成包含subject_ID、Sex、Age、Race四個變量的形式,所以需要把SexAge_Race這個變量拆分成Sex、Age、Race三個變量。Race這個變量很好拆分,可以用”_”作為拆分依據(jù),但是Sex和Age兩個變量之間是沒有分隔符號的,那該如何拆分呢?我們將采用兩種方法解決這個問題。
方法一:
在這一方法中,我們使用了substr和subinstr這兩個字符串的處理命令,substr使用格式為substr(s,n1,n2),表示把字符串s中從第n1個字符開始的n2個字符提取出來。所以第一行命令表示把SexAge_Race變量的前6個字符提取出來賦給變量Sex,這樣FEMALE就被提取出來了,第二行命令表示把SexAge_Race變量的前4個字符提取出來,這樣MALE就被賦給了Sex,所以Sex變量被成功提取出來。接著我們又使用了subinstr命令,這個命令的使用格式為subinstr(s1,s2,s3,n),表示把字符串s1中的n個子字符串“s2”用子字符串“s3”來替換,所以第三行命令表示把SexAge_RaceSex變量中Sex變量所表示的子字符串用''替代,即把全部FEMALE和MALE去掉,然后剩下的部分用split命令以”_”分開就可以了,最后重命名一下變量就得到了我們想要的數(shù)據(jù)。
在方法二中,我們主要使用了ustrregexm和ustrregexs這兩個字符串函數(shù)將正則表達式與字符串進行匹配以及字符串的提取與替換。
1、ustrregexm(s,re[,noc]):(u代表unicode,str代表string,即字符串,reg代表regular,ex代表expression,m代表match,即匹配)
“s”代表字符串,也可以是相應(yīng)的變量,”re”代表正則表達式,如果字符串中有正則表達式匹配到的內(nèi)容就賦值為1,否則賦值為0。noc這個部分可以填上一個數(shù)字,如果你定義了noc,并且是一個不為0的數(shù)字,那么在正則表達式和字符串匹配的時候是不區(qū)分大小寫的。
2、ustrregexs(n):(s代表substring,即子字符串)
n為非負整數(shù),代表ustrregexm(s,re)函數(shù)中第n個子表達式對應(yīng)的子字符串。若n為0,則代表引號中所有表達式對應(yīng)的子字符串。ustrregexs函數(shù)必須在ustrregexm函數(shù)運行之后才能運行,可用于提取子字符串。
除了這兩個字符串函數(shù),這里還涉及到正則表達式中的元字符,小編已經(jīng)貼心地幫你們把正則表達式中的常用元字符整理出來啦:
所以,方法二的處理過程如下:
首先創(chuàng)建一個子表達式,其中”.”符號表示可以匹配任意字符,用*?表示懶惰匹配模式,\d匹配數(shù)字,也就是把最左端的數(shù)字前面所有的內(nèi)容,提取出來并賦給變量Sex。同理,提取變量Age時,\d匹配數(shù)字,+表示把前面的字符或子表達式匹配幾次或多次,同樣使用懶惰模式,匹配到最近一個小數(shù)點,點后面的?表示匹配一次或零次,小數(shù)點可能不存在,所以后面的數(shù)字也是匹配任意次,提取出來之后用real函數(shù)把Age變成數(shù)值型變量。最后是Race變量,'_(.*)'表示匹配并提取_后面的所有內(nèi)容。這樣,我們就把數(shù)據(jù)變成我們想要的形式了。
除此之外,還可以用一個正則表達式來進行提?。?/span>
我們這個正則表達式由三個子表達式構(gòu)成,每個子表達式分別對應(yīng)我們想要提取的三個變量,先用ustrregexm進行匹配后,再用ustrregexs分別把第一個,第二個,第三個變量提取出來,就得到我們要的三個變量。
在我們以前的公眾號上,有位師兄寫過幾篇推文詳細介紹字符串函數(shù)和正則表達式中的常用元字符,大家有興趣可以去看一下。
聯(lián)系客服