如何创建一个基于 Stata 中关系列的新变量?
How can I create a new variable that is based on a relational column in Stata?
我的数据集是长格式的面板数据,包含以下列:id、var1、syear、partner_id
var1 是与具有相应 id
的人相关的兴趣值
partner_id是id
定义的人的伴侣(例如妻子或丈夫)的ID
现在我想创建一个新变量 var2,它采用每个 ID 和年份的人的合作伙伴的值(来自 var1)。
当对非面板数据使用下面的建议代码时(感谢@Nick-Cox)
var2 结果如下:
但我需要它是这样的:
由于我之前没有任何 Stata 经验,非常感谢您的帮助!
所以这是作为代码的简化数据(如果这很重要:在我的原始数据集中,多年来有更多的年份,有时不同的合作伙伴以及缺失;例如,当有一年没有合作伙伴时):
id syear var1 partner_id
1 2000 1000 2
1 2001 2000 2
2 2000 3000 1
2 2001 4000 1
考虑一下您首次发布的数据和问题的渲染(请注意,将数据呈现为图像不如将数据呈现为代码有用):
* Example generated by -dataex-. To install: ssc install dataex
clear
input float(id var1 partner_id var2)
1 5000 4 3000
2 2000 1 5000
3 1000 5 10000
4 3000 2 2000
5 10000 3 1000
end
gen wanted = var1[partner_id]
assert wanted == var2
编辑现在考虑将此解决方案用于修改后的数据。修改后的数据示例可能看似简单,只有两个标识符,它们是彼此的伙伴,对于这些简单的代码就足够了。但是,我写了更通用的代码。
* Example generated by -dataex-. To install: ssc install dataex
clear
input byte id int syear float var1 byte partner_id
1 2000 1000 2
1 2001 2000 2
2 2000 3000 1
2 2001 4000 1
end
save orig, replace
keep id var1 syear
rename (id var1) (partner_id wanted)
merge 1:1 partner_id syear using orig
sort id syear
list
+-----------------------------------------------------+
| partne~d syear wanted id var1 _merge |
|-----------------------------------------------------|
1. | 2 2000 3000 1 1000 matched (3) |
2. | 2 2001 4000 1 2000 matched (3) |
3. | 1 2000 1000 2 3000 matched (3) |
4. | 1 2001 2000 2 4000 matched (3) |
+-----------------------------------------------------+
我的数据集是长格式的面板数据,包含以下列:id、var1、syear、partner_id
var1 是与具有相应 id
的人相关的兴趣值partner_id是id
定义的人的伴侣(例如妻子或丈夫)的ID现在我想创建一个新变量 var2,它采用每个 ID 和年份的人的合作伙伴的值(来自 var1)。
当对非面板数据使用下面的建议代码时(感谢@Nick-Cox) var2 结果如下:
但我需要它是这样的:
由于我之前没有任何 Stata 经验,非常感谢您的帮助!
所以这是作为代码的简化数据(如果这很重要:在我的原始数据集中,多年来有更多的年份,有时不同的合作伙伴以及缺失;例如,当有一年没有合作伙伴时):
id syear var1 partner_id
1 2000 1000 2
1 2001 2000 2
2 2000 3000 1
2 2001 4000 1
考虑一下您首次发布的数据和问题的渲染(请注意,将数据呈现为图像不如将数据呈现为代码有用):
* Example generated by -dataex-. To install: ssc install dataex
clear
input float(id var1 partner_id var2)
1 5000 4 3000
2 2000 1 5000
3 1000 5 10000
4 3000 2 2000
5 10000 3 1000
end
gen wanted = var1[partner_id]
assert wanted == var2
编辑现在考虑将此解决方案用于修改后的数据。修改后的数据示例可能看似简单,只有两个标识符,它们是彼此的伙伴,对于这些简单的代码就足够了。但是,我写了更通用的代码。
* Example generated by -dataex-. To install: ssc install dataex
clear
input byte id int syear float var1 byte partner_id
1 2000 1000 2
1 2001 2000 2
2 2000 3000 1
2 2001 4000 1
end
save orig, replace
keep id var1 syear
rename (id var1) (partner_id wanted)
merge 1:1 partner_id syear using orig
sort id syear
list
+-----------------------------------------------------+
| partne~d syear wanted id var1 _merge |
|-----------------------------------------------------|
1. | 2 2000 3000 1 1000 matched (3) |
2. | 2 2001 4000 1 2000 matched (3) |
3. | 1 2000 1000 2 3000 matched (3) |
4. | 1 2001 2000 2 4000 matched (3) |
+-----------------------------------------------------+