Stata: 你還在用reshape轉換長寬數據嗎?那你就OUT了!

作者:華晨 (The University of Manchester) | (知乎 | 簡書 | 碼雲)

編者註:在處理縱橫變換數據時,Stata 官方提供的 reshape 命令十分便捷,但運算速度相對較慢。此時,可以使用外部命令 sreshapefastreshape 來轉換大型數據,速度可以提升 5-30 倍。本文介紹的 gatherspread 命令則可以處理上述命令都無法很好解決了的一類問題。

"扁擔長,板凳寬,板凳沒有扁擔長,扁擔沒有板凳寬。"長長寬寬繞不清。一些 Stata 的初學者也繞不清長寬數據的轉換。應該是reshape long呢?還是reshape wide呢?i又是什麼?j又是什麼?……

頭昏眼花了對不對!的確,Stata 官方的 reshape 命令在使用的時候會有不便。比如, reshape long 會要求被轉置的變數名要有相同前綴,諸如此類。那有沒有更 (jian) 人 (dan) 性 (cu) 化 (bao) 的方法呢?當然有啦,不然這篇推文的意義何在。

在介紹更簡單的長寬轉換命令前,初學者需要明白什麼叫長寬轉換。簡單地說:

原來橫著的行,你卻想把它豎起來,這就是「寬變長」; 原來豎著的列,你卻想把它橫過來,那就是「長變寬」。

神奇的 gatherspread 命令

說了半天,是什麼神奇的命令呢?燈燈燈等!是 gatherspreadgather 負責寬變長,spread 負責長變寬。要感受它們的神奇,你首先得安裝它們,執行以下命令:

ssc install tidy n

接下來就直接來看例子吧。


首先我們調入一個 Stata 自帶的發達國家教育經費佔 GDP 比重的數據。它包含了 3 個變數和 10 個觀察值。第一列是國家名稱,第二列是公共部門教育花銷占 GDP 的比重,第三列是私有部門教育花費佔 GDP 的比重。

sysuse educ99gdp.dta, clear n

下面我們想把這個寬數據變長,也就是讓每一個國家的公共部門教育花費佔比和私有部門教育花費佔比以不同觀察值來呈現,通俗地講就是各處一行。那麼,整個數據集將擴充成 20 個觀察值。執行以下命令:

gather public private n

對於一個國家(觀測值)來說,public 和 private 各部門的取值本來是橫著的,我們想讓它們豎起來,就在gather後面指定想要豎起來的變數名就可以了。

執行完後數據集變成什麼樣子了呢?

的確變成了一個含有20個觀察值的數據。第一列仍然是國家名稱,如預期一般,每個國家出現了兩次。第二列是自動生成的變數 variable ,它其實是將我們指定的原先橫著的變數給豎起來了,並將原來的變數名作為新變數的取值來標識這一行。第三列也是自動生成的變數 value,它就是教育花費佔比的取值。

是不是很簡 (cu) 單 (bao) ?

當然我們還可以自定義 variable 和 value 兩個變數的名稱,使得新數據的變數名有更清晰的含義。執行以下代碼:

sysuse educ99gdp.dta, clearngather public private, variable(sector) value(GDP) n

我們得到如下數據

注意到,兩個新生成的變數名稱改變成我們自定義的名稱了。

有人要說了,想變回去怎麼辦呢?長變寬? 執行以下命令:

spread sector gdp n

又變回了最初寬數據的形態。是不是很 easy?

這裡需要注意的是spread命令中指定的變數名的順序。 其實,就我的理解,長寬轉換的本質是一個類別變數的取值在二維表裡如何呈現的問題:如果將類別變數的各個類別取值放在變數名里,則是一個寬數據;如果將類別變數的各個取值放在同一個變數里,則是一個長數據。

spread後面指定的第一個變數名一定是那個類別變數。建議這個類別變數使用字元型變數(紅色的)。如果是數值型變數但是加了變數取值標籤(藍色的),生成的新變數的名稱含義就不是那麼直接了,有興趣的胖友可以自己試一下。

最後,還在 reshape上掙扎的胖友們,還不趕緊試試?

樣例代碼

clsncap ssc install tidynn*- Wide to longn sysuse educ99gdp.dta, clearn gather public privatenn*- Wide to long with renaming new variablesn sysuse educ99gdp.dta, clearn gather public private, variable(sector) value(gdp)nn n*- Long to widen n * Create the long data set firstn sysuse educ99gdp.dta, clearn gather public private, variable(sector) value(gdp)n n * Reshape long to widen spread sector gdpn

關於我們

  • Stata 連享會(公眾號:StataChina)】由中山大學連玉君老師團隊創辦,旨在定期與大家分享 Stata 應用的各種經驗和技巧。
  • 公眾號推文同步發佈於 【簡書-Stata連享會】 和 【知乎-連玉君Stata專欄】。可以在簡書知乎中搜索關鍵詞StataStata連享會後關注我們。
  • 推文中的相關數據和程序,以及 Markdown 格式原文 可以在 【Stata連享會-碼雲】中獲取。【Stata連享會-碼雲】 中還放置了諸多 Stata 資源和程序。如 Stata命令導航 || stata-fundamentals || Propensity-score-matching-in-stata || Stata-Training 等。

聯繫我們

  • 歡迎賜稿: 歡迎將您的文章或筆記投稿至Stata連享會(公眾號: StataChina),我們會保留您的署名;錄用稿件達五篇以上,即可免費獲得 Stata 現場培訓 (初級或高級選其一) 資格。
  • 意見和資料: 歡迎您的寶貴意見,您也可以來信索取推文中提及的程序和數據。
  • 招募英才: 歡迎加入我們的團隊,一起學習 Stata。合作編輯或撰寫稿件五篇以上,即可免費獲得 Stata 現場培訓 (初級或高級選其一) 資格。
  • 聯繫郵件: StataChina@163.com

特別說明

文中包含的鏈接在微信中無法生效。請點擊閱讀原文,轉入本文【簡書版】


weixin.qq.com/r/7Ujm-tf (二維碼自動識別)

Stata連享會二維碼


推薦閱讀:

零基礎如何入門stata?
Stata dofile 轉換 PDF 製作講義方法
Stata小程序: 提取簡書文章列表
應用stata過程中,遇到過哪些特別棘手但最終得以解決的問題?
碼云:我把常用小軟體都放這兒了

TAG:Stata | stata学习 | stata连享会 |