Merge 当密钥可能混合在不同的变量中时,是否有一种在Stata中合并的方法?
我试图将两个数据集以1:1的比例进行合并,这两个数据集对应于不同时期对相同个体的调查;未构造唯一标识符 收集的是电子邮件地址,尽管这些地址存储在每个数据集中的三个不同变量中。人们不一定在每一页上写相同的地址 有人知道如何或是否能做到这一点吗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
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
一种开始的方法是在每个数据集中每个人的三个地址中进行选择: 如果按每个人的地址排序,则在排序之后
如果在这两个数据集中执行此操作,并且在结果中使用代码>合并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种,但仔细研究会发现第二种匹配。一种开始的方法是在每个数据集中每个人的三个地址中进行选择: 如果按每个人的地址排序,则在排序之后
如果在这两个数据集中执行此操作,并且在结果中使用代码>合并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合并,并对下一个组合使用不匹配的观察值。