首页 文章

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

提问于
浏览
0

我有一个数据集,允许链接朋友(即观察对等组),从而可以观察到个人朋友的特征 . 我所拥有的是一个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 回答

  • 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)
    
  • 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在save`文件'中给了我一个错误,“无效文件”,替换点 . 我有一个受限制的数据集,需要将我的所有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
    

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

相关问题