本文作者:俞詩琪
文字編輯:王碧琪
技術總編:李朋衝
在數據處理中,我們經常會遇到一個數據集中有多行重複觀測值的情形。這不僅耗費更多的存儲空間,還可能降低工作效率甚至是分析結果的準確性。通常而言,我們可以採用duplicates drop批量刪除數據集中的這些重複項。
當然,對整個數據集刪除重複觀測值是最簡單的情形,更為常見的,是對於幾個變量的聯合取值進行重複值的剔除。我們當然可以使用duplicates命令來完成這項工作,只是,所有的刪除都不能貿然進行,對重複觀測值進行審查,是非常有必要的。這個過程也會加深我們對於數據結構的了解,從而更好地為實證研究服務。在本文中,我們將會介紹,刪除之前,我們需要做些什麼。
首先,我們使用auto數據集,溫習一下duplicates命令在刪除重複項中的妙用。其基本語法如下:
duplicates drop [if] [in]
duplicates drop varlist [if] [in], force
當不加變量名時,表示對整個數據集進行剔重;反之,則表示僅對選定變量的取值進行剔重。其後跟的force選項,表示強力刪除選定變量的重複項。
我們先用expand命令複製數據集前兩行觀測值,然後用duplicates drop對整個數據集進行剔重,程序及結果如下:
sysuse auto, clearexpand 21 in 1/2 duplicates drop對整個數據集,刪除了40條重複值,僅保留其第一次出現的觀測值。
我們也可保留變量turn的前5行觀測值,並使用duplicates drop命令刪除其中的turn的重複值。程序及結果如下:
sysuse auto, clearkeep in 1/5list make turnduplicates drop turn, force //只保留第一個重複值可知,前五行中,變量turn的兩條重複值都被刪除(對應品牌分別為:「AMC Pacer」和「Buick Century」),僅保留第一個turn取值為40的觀測值(對應品牌為:「AMC Concord」)。
在此基礎上,我們進一步展示duplicates命令在報告、列示及標記變量重複項方面的強大功能。
duplicates命令可報告整個數據集或者特定變量的重複值個數情況。其基本語法如下:
duplicates report [varlist] [if] [in]
其中,varlist可表示為一個或多個變量名,若選取變量不止一個,則顯示所選變量的聯合取值情況;如果不加varlist,則表示查看整個數據集的重複值情況。
在本例中,我們以auto.dta中的變量trunk和turn為例,報告其重複項情況。需注意的是,這裡報告的是聯合取值的重複項情況。程序和結果如下:
sysuse auto, clearduplicates report trunk turn結果顯示,出現一次(copies=1)的觀測值有40條,表明數據集的74條觀察值中,trunk和turn的聯合取值有40條是unique observations;出現兩次的觀測值有22條,此時surplus為11,表明存在11條重複值。依據每一行結果,也可推斷出變量trunk和turn有55(40+11+4)個不同的聯合取值。
在上例中,我們已經知道觀測值的重複情況,想要進一步了解是哪一行的哪個值重複,則可通過命令duplicates examples查看。它可以列示重複項的某一個具有代表性的觀測值,並顯示其所在行數及出現次數。該命令的基本語法如下:
duplicates examples [varlist] [if] [in] [, options]
這裡依然對變量trunk和turn進行分析,查看重複項的具體位置。程序和結果如下:
duplicates examples trunk turn其中,表頭#代表出現次數,e.g.obs代表每組其中一個重複項所在行數。以表格第一行為例,變量trunk和turn取值為8和38的組合出現兩次,位於第45行。上表的結果與(1)中的結果也一一對應,即出現兩次的有11組、出現3次有4組。
更加直觀地,我們可以採用duplicates tag命令,通過生成新變量的方式標記重複項與非重複項。其基本語法如下:
duplicates tag [varlist] [if] [in], generate(newvar)
其中,newvar為新產生的變量,用於定義所在行對應觀測值的多餘次數。
依然選取變量trunk和turn進行分析,並生成新變量copy。程序及部分結果如下:
duplicates tag trunk turn, gen(copy)list trunk turn copy如上,變量copy顯示了trunk和turn聯合取值的重複情況。其中,copy取值為0時表示不存在重複項,即該行觀測值在整個數據集中僅出現一次;相應地,copy取值為1時表示重複一次,即該行觀測值在整個數據集中出現兩次。以此類推。
duplicates有一些比較實用的選項,可以更好地幫助我們在Stata結果窗口裡查看重複值(比如,我們可以使用duplicates list列示重複觀測值)。下面我們介紹幾個主要選項:
compress:壓縮結果顯示時的列寬
nocompress:使用display格式報告結果,且不壓縮列寬
fast:與nocompress選項作用類似,如果是大樣本,程序運行時間上會有所縮短
string(#):報告結果中,字符串形式的變量值僅保留#個字符,默認值是10個字符
clean:不顯示分隔線
divider:每一列都顯示一道分隔線
separator:可定義每幾行顯示一道分隔線,默認的是每5行顯示一道分隔線
sepby(varlist):當變量varlist的值發生變化時,設置一道分隔線
nolabel:顯示具體的數值,而非值標籤,比如foreign變量
同樣,我們用auto數據集舉例,保留變量make、price、mpg、rep78和foreign,並且複製數據集前兩行觀測值,幫助大家更好理解這些選項。程序及結果截圖如下:
sysuse auto, clearkeep make price mpg rep78 foreignexpand 2 in 1/2duplicates list //正常顯示列寬brduplicates list, compress //壓縮顯示時的列寬,此處壓縮表頭為goup:和obs:的列brduplicates list make, str(5) //縮減字符串的顯示長度至5個字符br此外還有:
duplicates list, sepby(price) //依據目標變量price進行分隔,如果price的值發生變化,就設置一道分隔線br由此可見,我們可以運用以上選項,使數據結果的列示更簡潔、明了,另外還有fast、separator等選項,由於篇幅有限,這裡不做贅述,大家有興趣可以自己運用這些選項,體會它們在實際操作中的作用。
總體而言,這個命令用法很簡單,功能也很實用,那麼大家都掌握了嗎?趕緊來試一試吧!
對我們的推文累計打賞超過1000元,我們即可給您開具發票,發票類別為「諮詢費」。用心做事,不負您的支持!數據含義記不住?—— label「大神」來幫忙
實戰演練-如何獲取眾籌項目的團隊信息
Zipfile(一)
tabplot命令
Jupyter Notebook不為人知的秘密
字符串方法(三)
數據,我要「拷打」你
關於我們
微信公眾號「Stata and Python數據分析」分享實用的stata、python等軟體的數據處理知識,歡迎轉載、打賞。我們是由李春濤教授領導下的研究生及本科生組成的大數據處理和分析團隊。
此外,歡迎大家踴躍投稿,介紹一些關於stata和python的數據處理和分析技巧。投稿郵箱:statatraining@163.com投稿要求:
1)必須原創,禁止抄襲;
2)必須準確,詳細,有例子,有截圖;
注意事項:
1)所有投稿都會經過本公眾號運營團隊成員的審核,審核通過才可錄用,一經錄用,會在該推文裡為作者署名,並有賞金分成。
2)郵件請註明投稿,郵件名稱為「投稿+推文名稱」。
3)應廣大讀者要求,現開通有償問答服務,如果大家遇到有關數據處理、分析等問題,可以在公眾號中提出,只需支付少量賞金,我們會在後期的推文裡給予解答。