• stata: merge 合并; reclink字符串的模糊合并; joinby 命令多对多匹配


    1. merge横向精确合并

    一般来说,用到stata进行数据合并,都应该是用1:1合并,这才能一一对应,所以,非一一对应的合并我就不说了。免得混乱。
        一般来说,善用生成的 _merge 变量来删除不要的匹配,再加上知道下面的几种情况怎么匹配,基本上已经够用了。
        (merge的用于匹配的变量格式必须一致,格式不一致的请参照命令help recast)
    首先分析一下,用什么指标能唯一地识别出一个数据?显然,对应上面这个面板数据,用year和id两个指标,就能唯一的指明某一条数据。所以我们应用year和id这个组合来进行匹配。
            然后,选择其中一个数据集合作为原本的数据集合。另一个数据集合就用来匹配,匹配成功后就加进原来数据集里面。
            所以,上述的操作代码为:

    //加载数据集1.dta
    use "C:UsersAdministratorDesktop1.dta"
    //根据year id两个维度来匹配数据
    merge 1:1 year id using "C:UsersAdministratorDesktop2.dta"

    互补的数据,你有我没有,我有你没有,我们只需要非空值。
    要合并这个方法很简单,加一个update选项就可以了。update的意思是,如果原来的数据集合该数据为空,那么就使用匹配数据集里面的非空数据替换掉空数据。

    //加载数据集1.dta
    use "C:UsersAdministratorDesktop1.dta"
    //根据year id两个维度来匹配数据
    merge 1:1 year id using "C:UsersAdministratorDesktop2.dta",update

    数据集1和数据集2的 var3 变量里面,有一部分是重叠的如果你想要原数据集(也就是数据集1)作为正确的数据,也就是这个:

    //加载数据集1.dta
    use "C:UsersAdministratorDesktop1.dta"
    //根据year id两个维度来匹配数据
    merge 1:1 year id using "C:UsersAdministratorDesktop2.dta",update

    但是如果你认为匹配数据集(也就是数据集2)的数据才是正确的,也就是这样:

    //加载数据集1.dta
    use "C:UsersAdministratorDesktop1.dta"
    //根据year id两个维度来匹配数据
    merge 1:1 year id using "C:UsersAdministratorDesktop2.dta",update replace

    merge 需要注意的事项:

    m:1 表示keyword在using文件中必须是唯一没有重复的的
    1:m 表示keywords在master文件中必须是唯一没有重复的

    在merge的过程中有可能会出现报错,说year id对应的选项不唯一。可以用以下代码去保证数据的唯一

    use "number_all.dta",clear
    sort stkcd year              
    by stkcd year: gen set=_n
    keep if set==1
    drop set

    merge完之后结果窗口会出现下列信息,同时表格中会出现一个新的变量_merge,

    当_merge为1时,该数据仅在主数据集中存在;

    当_merge为2的时候,该数据仅在用于匹配的数据集中出现;

    当_merge为3的时候才表示匹配成功,数据在两个数据集中同时存在。

    接着我们可以直接keep if _merge==3,则可以保留匹配成功的数据,删除匹配不成功的数据。

    如果我们需要进行多次merge,不要忘记将_merge变量删除。drop _merge就可以实现。

    2. reclink字符串的模糊合并

    use "baseinfo.dta",clear
    gen id1=_n
    save "baseinfo.dta",replace
    use "iv.dta",clear
    gen id2=_n
    save "iv.dta",replace
    
    use "baseinfo.dta",clear
    reclink province using "iv.dta", idmaster(id1) idusing(id2) gen(matchscore)
    list, clean noobs
    drop _merge id1 id2
    save "baseinfo.dta",replace

    reclink 命令注意事项

    • 两份数据中 id 名必须不同。如,在上述命令中 idmaster(id1)idusing(id2) 分别代表 master data 中的 id 和 using data 中的 id,结果第五列和第七列解读为 master data中的id1 = 1 和 using data 中的 id2 = 1 匹配成功;
    • _merge 变量含义与前文类似;
    • reclink 命令可解决的匹配问题:大小写不同、部分字母缺漏或增加、以及顺序颠倒;
    • matchscore 变量为匹配分数,分数越高代表匹配效果越好
    • 另外,reclink 命令还允许对匹配变量设定不同权重。比如,在这个例子中,我们认为 city 是最重要的,则仅需增加 vmatch() 选项设定权重。具体示例如下:
      use file1.dta,clear
      reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore) wmatch(1 15)
      list, clean noobs

       

  • 相关阅读:
    NYOJ-301递推求值
    二叉树
    从c到c++
    NYOJ-93汉诺塔(三)
    历届试题 最大子阵
    最大子序列和最大子矩阵
    【贪心】电视节目安排
    【贪心】线段覆盖
    【贪心】取数游戏
    【贪心】智力大冲浪
  • 原文地址:https://www.cnblogs.com/celine227/p/14653993.html
Copyright © 2020-2023  润新知