關于本站
人大經(jīng)濟論壇-經(jīng)管之家:分享大學、考研、論文、會計、留學、數(shù)據(jù)、經(jīng)濟學、金融學、管理學、統(tǒng)計學、博弈論、統(tǒng)計年鑒、行業(yè)分析包括等相關資源。
經(jīng)管之家是國內(nèi)活躍的在線教育咨詢平臺!
經(jīng)管之家新媒體交易平臺
提供"微信號、微博、抖音、快手、頭條、小紅書、百家號、企鵝號、UC號、一點資訊"等虛擬賬號交易,真正實現(xiàn)買賣雙方的共贏!菊堻c擊這里訪問】
TOP熱門關鍵詞
免費學術公開課,掃碼加入 |
轉載自微信公眾號:爬蟲俱樂部《
多對多合并》我們在數(shù)據(jù)處理時,經(jīng)常需要對文件進行橫向合并,我們知道m(xù)erge 1:1 varlist using filename [, options]可以進行一對一合并;merge 1:m varlist using filename [, options]可以進行一對多合并;merge m:1 varlist using filename [, options]可以進行多對一合并,然而在使用merge m:m varlist using filename [, options]進行多對多合并是有問題的,那么問題在哪?如何解決?這篇推文將會給大家解釋清楚。
一
小試牛刀
1.生成兩個dta文件:
clear
input id str3 v1
1 "a"
1 "b"
1 "c"
1 "d"
1 "e"
end
save 1.dta, replace
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8ldI1txSuiaShe4gwWXszW7L0BQ7w5mR9q11qy0PZkKdG2mr8TvgJFXw/0?wx_fmt=png
clear
input id str3 v2
1 "d"
1 "e"
1 "f"
end
save 2.dta, replace
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8DIXfr4tRlWfMIR5SQZLDflu5od3o9LaAWxlnykYr03tQl8eSIwQemg/0?wx_fmt=png
接著,我們將兩個文件進行橫向合并,可以看到,由于兩個文件中id不是唯一識別的,屬于多對多合并。我們想要得到的結果如下圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt88Qqdia8dZJhUbiadaDJ0YA2OA38vbT09bDThluvdWMSYwvtzmZBlc4icQ/0?wx_fmt=png
2.直接用merge m:m橫向合并數(shù)據(jù)
use 1.dta, clear
merge m:m id using 2.dta
drop _m
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8xRiaia8CgNTQbbr5dfOTbwxkZ2qeLvgUTmVckHSrGUpd47ZS9vfRSAEQ/0?wx_fmt=png
可以看到,直接使用merge m:m進行多對多合并時,第一,并不是1.dta的觀測值分別對應2.dta的每一條觀測值;第二,當某個文件的觀測值少時,將會以該文件中的最后一條觀測值對另一個文件中的觀測值進行合并,如上圖第4、5行。那么怎么得到我們想要的結果呢?
3.先擴展,再合并
整體思路是,把多對多合并變?yōu)橐粚Χ嗷蚨鄬σ缓喜ⅰJ紫龋覀冊?.dta中生成變量n,等于所在行行號,然后求出n的最大值,放在局部宏中,并保存為3.dta文件,程序如下:
use 1.dta, clear
bysort id: gen n = _n
sum n
local max = r(max)
save 3.dta, replace
結果如圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8RU7bN0kusgHLZicCEuDjrUDEWpUeS9RAc8sdOcRFmmR1rKhoeSLW0ibw/0?wx_fmt=png
這樣,把id和n兩個變量作為合并依據(jù)就變成唯一的了,可以看到,n最大值為5。接著在2.dta中,對數(shù)據(jù)進行擴充相應的倍數(shù),即1.dta中變量n的最大值:
use 2.dta,clear
expand `max'
bysort id v2 : gen n = _n
sort n v2
結果如圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8xkHSibl2VRGa7XVGV1MicPbzDT7D1pZd6u3ic0rj6VgqcORtswhM6HhuQ/0?wx_fmt=png
擴充后的數(shù)據(jù),id和n作為合并依據(jù)的話,每個都為3個,所以可以與3.dta進行多對一合并,程序和結果如下:
merge m:1 id n using 3.dta
order id v1
sort id v1 v2
drop n _m
結果如圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8qvVsCo1u1QcUzxzEAavx3CH2lfLicA0Q0Wic6OaLcM68Kjo0aHJiceKzw/0?wx_fmt=png
二
實例演練
我們在做事件研究時,如果某個事件發(fā)生在上市公司停牌期間,我們往往需要把其剔除掉,那么首先,我們需要按照股票代碼把事件列表和停復牌時間進行橫向合并,由于同一個公司可能對應多個時間,也可能多次停牌,因此應該進行多對多合并,為了方便大家操作,我們手動生成一個事件列表:
clear
set more off
input Stkcd str15 date
000001 "2006-03-01"
000001 "2007-06-05"
000001 "2007-05-05"
000001 "2010-03-01"
000001 "2013-05-06"
000002 "2003-07-25"
000002 "2009-08-16"
000002 "2010-05-09"
end
save 事件列表,replace
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8iaIiaACCooKp9AzMTw6zVEvD5lH2l7c9On0rCGfvAW8NGPx98Xofy1ibQ/0?wx_fmt=png
我們截取Stkcd為000001和000002公司的停復牌日期,如下圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8EHYCIZ9rrGHaUouSN1UNATUwSoDtngG7cnj9W0w3rNX1ySnLnMGR6Q/0?wx_fmt=png
其中,startdate為停牌日期,enddate為復牌日期,合并之后,如果date,即時間發(fā)生日在停復牌時間之間,就剔除掉。
接下來,橫向合并兩個文件,程序如下:
use 事件列表, clear
bysort Stkcd : gen n = _n
sum n
local max = r(max)
save 事件列表1,replace
use停復牌,clear
expand `max'
bysort Stkcd startdate enddate : gen n = _n
merge m:1 Stkcd n using 事件列表1
keep if _m == 3
drop _m n
結果如圖所示:
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt84LSMvdUxVKQY7QvePbicBaUCrDpIMKl7WQTBrOUjDUCH1pRuibpE6zdw/0?wx_fmt=png
這樣,每一個事件都對應所有的停復牌日期,接著將發(fā)生在停復牌的事件刪除即可,程序如下:
gen date1 = date(date,"YMD")
gen num = 1 if date1 >= startdate & date1 <= enddate
keep Stkcd date num
duplicates drop
sort Stkcd date num
bysort Stkcd date :carryforward num,replace
drop if num == 1
drop num
https://img.chuansongme.com/mmbiz_png/ACviaWTBFxhbibXIw4icOjXhiaGRLPO8Stt8jC1wZ1f18gibeqwjYbiciaM6L69cOoOYtc8bBkicCBlMcTq0bteEAHib1iaA/0?wx_fmt=png
免流量費下載資料----在經(jīng)管之家app可以下載論壇上的所有資源,并且不額外收取下載高峰期的論壇幣。
涵蓋所有經(jīng)管領域的優(yōu)秀內(nèi)容----覆蓋經(jīng)濟、管理、金融投資、計量統(tǒng)計、數(shù)據(jù)分析、國貿(mào)、財會等專業(yè)的學習寶庫,各類資料應有盡有。
來自五湖四海的經(jīng)管達人----已經(jīng)有上千萬的經(jīng)管人來到這里,你可以找到任何學科方向、有共同話題的朋友。
經(jīng)管之家(原人大經(jīng)濟論壇),跨越高校的圍墻,帶你走進經(jīng)管知識的新世界。
掃描下方二維碼下載并注冊APP
本文論壇網(wǎng)址:http://xalimeijing.com/thread-7198016-1-1.html
您可能感興趣的文章
本站推薦的文章
人氣文章
2.轉載的文章僅代表原創(chuàng)作者觀點,與本站無關。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,本站對該文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性,不作出任何保證或承若;
3.如本站轉載稿涉及版權等問題,請作者及時聯(lián)系本站,我們會及時處理。