Merge 当密钥可能混合在不同的变量中时,是否有一种在Stata中合并的方法?

Merge 当密钥可能混合在不同的变量中时,是否有一种在Stata中合并的方法?,merge,stata,panel-data,Merge,Stata,Panel Data,我试图将两个数据集以1:1的比例进行合并,这两个数据集对应于不同时期对相同个体的调查;未构造唯一标识符 收集的是电子邮件地址,尽管这些地址存储在每个数据集中的三个不同变量中。人们不一定在每一页上写相同的地址 有人知道如何或是否能做到这一点吗 clear set more off input str16 mai1 str16 email2 str16 email3 str16 data1 "jhon@foo.com" "jhon@foo.com

我试图将两个数据集以1:1的比例进行合并,这两个数据集对应于不同时期对相同个体的调查;未构造唯一标识符

收集的是电子邮件地址,尽管这些地址存储在每个数据集中的三个不同变量中。人们不一定在每一页上写相同的地址

有人知道如何或是否能做到这一点吗

clear
set more off

input str16 mai1 str16 email2   str16 email3         str16 data1
"jhon@foo.com"  "jhon@foo.com"  "jhonnie@foofoo.net" "aaaa1"
"bob@foo.net"   ""              "bob@foo.net"        "bbbb1"
end

tempfile first
save "`first'"

clear

input str16 mai1    str16 email2    str16 email3   str16 data1
""                  "bob@foo.net"   ""      ""     "bbbb2"
"jhonnie@foo.net"   ""              ""             "aaaa2"
end

一种开始的方法是在每个数据集中每个人的三个地址中进行选择:

如果按每个人的地址排序,则在排序之后

  • 如果所有电子邮件地址一致,则第二个与所有电子邮件地址相同

  • 如果两个电子邮件地址一致,则第二个将是约定的地址,因为根据字母表,这两个地址将最后排序或第一排序,但两个地址中的任何一个都将是第二个。(原理类似于3个数字的中间值:对于1、1、2或1、2、2这样的情况,如果3中有任何2个数字一致,则该数字为中间值;对于按字母数字排序的字符串也是如此。)

  • 如果有三个电子邮件地址不一致,那么第二个也不会比其他任何一个更糟糕

  • 如果一个电子邮件地址为空,而其他人不同意,则同样适用

  • 如果两个电子邮件地址为空,请使用给定的电子邮件地址

  • 如果都是空白,天知道

  • 如果在这两个数据集中执行此操作,并且在结果中使用代码>合并1:1/代码>,则查看“<代码>合并< /代码>之后不匹配的内容,并考虑您的选项。有一个选择,从放弃不匹配的东西到尝试其他东西

    clear 
    input str16 mai1 str16 email2   str16 email3         str16 data1
    "jhon@foo.com"  "jhon@foo.com"  "jhonnie@foofoo.net" "aaaa1"
    "bob@foo.net"   ""              "bob@foo.net"        "bbbb1"
    end
    
    gen long id = _n 
    
    rename mai1 email1 
    reshape long email , i(id) j(which)
    bysort id (email) : gen EMAIL = email[2]
    replace EMAIL = email[3] if EMAIL == "" 
    
    reshape wide email, i(id) j(which)
    
    list 
    
         +----------------------------------------------------------------------------+
         | id         email1         email2             email3   data1          EMAIL |
         |----------------------------------------------------------------------------|
      1. |  1   jhon@foo.com   jhon@foo.com   jhonnie@foofoo.n   aaaa1   jhon@foo.com |
      2. |  2    bob@foo.net                       bob@foo.net   bbbb1    bob@foo.net |
         +----------------------------------------------------------------------------+
    

    您可以扩展此技术,在每种情况下找到第二种猜测,最糟糕的是第三种猜测


    在数据示例中,此技术将捕获2种情况中的1种,但仔细研究会发现第二种匹配。

    一种开始的方法是在每个数据集中每个人的三个地址中进行选择:

    如果按每个人的地址排序,则在排序之后

  • 如果所有电子邮件地址一致,则第二个与所有电子邮件地址相同

  • 如果两个电子邮件地址一致,则第二个将是约定的地址,因为根据字母表,这两个地址将最后排序或第一排序,但两个地址中的任何一个都将是第二个。(原理类似于3个数字的中间值:对于1、1、2或1、2、2这样的情况,如果3中有任何2个数字一致,则该数字为中间值;对于按字母数字排序的字符串也是如此。)

  • 如果有三个电子邮件地址不一致,那么第二个也不会比其他任何一个更糟糕

  • 如果一个电子邮件地址为空,而其他人不同意,则同样适用

  • 如果两个电子邮件地址为空,请使用给定的电子邮件地址

  • 如果都是空白,天知道

  • 如果在这两个数据集中执行此操作,并且在结果中使用代码>合并1:1/代码>,则查看“<代码>合并< /代码>之后不匹配的内容,并考虑您的选项。有一个选择,从放弃不匹配的东西到尝试其他东西

    clear 
    input str16 mai1 str16 email2   str16 email3         str16 data1
    "jhon@foo.com"  "jhon@foo.com"  "jhonnie@foofoo.net" "aaaa1"
    "bob@foo.net"   ""              "bob@foo.net"        "bbbb1"
    end
    
    gen long id = _n 
    
    rename mai1 email1 
    reshape long email , i(id) j(which)
    bysort id (email) : gen EMAIL = email[2]
    replace EMAIL = email[3] if EMAIL == "" 
    
    reshape wide email, i(id) j(which)
    
    list 
    
         +----------------------------------------------------------------------------+
         | id         email1         email2             email3   data1          EMAIL |
         |----------------------------------------------------------------------------|
      1. |  1   jhon@foo.com   jhon@foo.com   jhonnie@foofoo.n   aaaa1   jhon@foo.com |
      2. |  2    bob@foo.net                       bob@foo.net   bbbb1    bob@foo.net |
         +----------------------------------------------------------------------------+
    

    您可以扩展此技术,在每种情况下找到第二种猜测,最糟糕的是第三种猜测


    在你的数据示例中,这种方法会抓住2个案例中的1个,但仔细研究会发现第二个匹配。

    你知道为什么每个参与者在所有调查中不一定写相同的电子邮件吗?是因为打字错误还是其他原因?听起来您可能需要使用某种近似/模糊字符串匹配来确定“正确”的电子邮件,然后将其用作唯一标识符。快速搜索
    近似字符串匹配stata
    可以获得一些有用的资源。您好,我不知道他们为什么这么做。我的猜测是,由于这是一项在大学里进行的调查,他们可能会同时使用自己的大学和个人电子邮件,这取决于他们是否希望得到一些反馈或跟进。但这只是一个猜测。我将研究这个近似的字符串匹配,谢谢你的提示。你知道为什么每个参与者在所有调查中不一定写相同的电子邮件吗?是因为打字错误还是其他原因?听起来您可能需要使用某种近似/模糊字符串匹配来确定“正确”的电子邮件,然后将其用作唯一标识符。快速搜索
    近似字符串匹配stata
    可以获得一些有用的资源。您好,我不知道他们为什么这么做。我的猜测是,由于这是一项在大学里进行的调查,他们可能会同时使用自己的大学和个人电子邮件,这取决于他们是否希望得到一些反馈或跟进。但这只是一个猜测。我将研究这个近似字符串匹配,谢谢你的提示。谢谢你的回答和代码。我会尽快尝试这种方法。另一种方法是,我在考虑按顺序对两个数据集中的九种可能的组合进行1:1合并,并将不匹配的观察结果用于下一个组合。感谢您的回答和代码。我会尽快尝试这种方法。另一种方法是,我在考虑按顺序对两个数据集中的九种可能的组合进行1:1合并,并对下一个组合使用不匹配的观察值。