为一个id生成变量观察值,以便观察另一个id的新变量

时间:2015-10-27 15:39:34

标签: variables stata

我有一个数据集,允许链接朋友(即观察同伴群组),从而可以观察到个人朋友的特征。我所拥有的是一个8位数的标识符,id,每个id的朋友id(最多10个朋友),然后是许多特征变量。

我想接受一个人并创建一个变量,这些变量是每个朋友的外国出生状态。

如果外国出生,我已经有一个每个人的指标为1。以下是一个小例子,仅供一位朋友使用。请注意,MF1表示男性朋友1,然后MF1id表示男性朋友1的身份证号码。受访者最多可列出5位男性朋友和5位女性朋友。

example

所以,我需要Stata查看MF1id,然后将其与id列匹配,然后查看f_born以查找匹配的ID,最后输入f_born的值返回到MF1f_born下的原始ID。

编辑:我在解释数据结构方面表现不佳。我有一个横截面,所以每个唯一身份1观察。第1行是第一个8位数的id号,其中所有变量都在该行之后。重复的id号位于为每个人列出的朋友ID(例如mf1id)和id列之间。我希望这更清楚一点。

2 个答案:

答案 0 :(得分:1)

凯文克劳写了vlookup,这使得这类事情变得非常简单:

use http://www.ats.ucla.edu/stat/stata/faq/dyads, clear
drop team y
rename (rater ratee) (id mf1_id)
bys id: gen f_born = mod(id,2)==1

net install vlookup
vlookup mf1_id, gen(mf1f_born) key(id) value(f_born)

答案 1 :(得分:0)

所以,Dimitriy对vlookup的建议是完美的,除非它对我不起作用。在用我的数据集尝试vlookup之后,Dimitriy用于他的示例的UCLA数据和我创建的玩具数据集vlookup总是在程序试图将临时文件保存到我的临时文件夹时失败。下面是vlookup的程序。注意它设置tempfile文件,操作数据,然后保存文件。



*! version 1.0.0 KHC 16oct2003
program define vlookup, sortpreserve
	version 8.0
	syntax varname, Generate(name) Key(varname) Value(varname)
	qui {
		tempvar g k
		egen `k' = group(`key')
		egen `g' = group(`key' `value')
		local k = `k'[_N]
		local g = `g'[_N]
		if `k' != `g' {
			di in red "`value' is unique within `key';"
			di in red /*
			*/ "there are multiple observations with different `value'" /*
			*/ " within `key'."
			exit 9
		}
		preserve
			tempvar g _merge
			tempfile file
			sort `key'
			by `key' : keep if _n == 1
			keep `key' `value'
			sort `key'
			rename `key'  `varlist'
			rename  `value' `generate'
			save `file', replace
		restore
		sort `varlist'
		joinby `varlist' using `file', unmatched(master) _merge(`_merge')
		drop `_merge'

	}
end
exit




出于某种原因,Stata给了我一个错误,"无效的文件,"在保存`文件',替换点。我有一个受限制的数据集,需要将我的所有Stata临时文件指向一个非常特定的文件夹,该文件夹中有一个擦除程序经常扫描它。我不知道为什么这会产生问题,但也许是,我真的不知道。无论如何,我调整了vlookup程序,它似乎做了我现在需要的。



clear all
set more off
capture log close


input aid mf1aid fborn
	  1	  2	     1
	  2   1		 1
	  3   5      0
	  4	  2      0
	  5   1      0
	  6   4      0
	  7   6      1
	  8   2      .
	  9   1      0
	  10  8      1
end		


program define justlinkit, sortpreserve
	syntax varname, Generate(name) Key(varname) Value(name)
	qui {
preserve 
	tempvar g _merge
	sort `key'
	by `key' : keep if _n ==1
	keep `key' `value'
	sort `key'
	rename `key' `varlist'
	rename `value' `generate'
	save "Z:\Jonathan\created data sets\justlinkit program\fchara.dta",replace
restore
sort `varlist'
joinby `varlist' using "Z:\Jonathan\created data sets\justlinkit program\fchara.dta", unmatched(master) _merge(`_merge')
drop `_merge'

	}
end

// set trace on
justlinkit mf1aid, gen(mf1_fborn) key(aid) value(fborn)

sort aid 
list




嗯,这解决了我的问题。感谢所有回复的人,没有你,我不会想到这一点。