【问题标题】:Generating variable observations for one id to be observation for new variable of another id为一个 id 生成变量观察值以观察另一个 id 的新变量
【发布时间】:2015-10-27 15:39:34
【问题描述】:

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

我想取一个人并创建一个变量,它是每个朋友的外国出生状态。

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

所以,我需要Stata查看MF1id,然后将其匹配到id列,然后查看f_born匹配的id,最后输入f_born的值回到原来的id下MF1f_born.

edit:我在解释数据结构方面做得很差。我有一个横截面,因此每个唯一 ID 进行 1 次观察。第 1 行是前 8 位 id 编号,所有变量都在该行之后。重复的 id 编号介于为每个人列出的朋友 id(例如 mf1id)和 id 列之间。我希望这更清楚一点。

【问题讨论】:

  • 由于缺乏任何可使用的样本数据,我将限制自己建议想到的解决方案将使用merge,并且很可能使用reshape long。我希望您描述的拟人化解决方案(Stata 俯视,向下看,输入回原来的)不是您计划实施的,而只是描述一个人(而不是 Stata)如何创建所需的结果。

标签: variables stata


【解决方案1】:

Kevin Crow 写了 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)

【讨论】:

  • 好提示。 net install vlookup, from(http://www.stata.com/users/kcrow)是如何安装的。
  • 我以前不知道,即使在关注 Statalist 和 Stack Overflow 一年之后。很好,利用别人的工作总是比自己写更容易。 view vlookup.ado 展示了一些非常干净的代码,是有效 Stata 的一堂好课。
  • 谢谢大家!除了 Dimitriy 的示例之外,我还安装了 vlookup 并查看了它提供的帮助文件。帮助文件本身中的示例似乎完全符合我的要求。我将以下语法放在我的 do 文件中
  • ooops....vlookup mf1_id, gen(mf1f_born) key(id) value(f_born) 但是 stata 给了我以下错误消息“f_born 在 id 中是唯一的;有多个观察结果具有不同的 f_born在身份证内。”到目前为止,我还无法弄清楚为什么会发生这种情况。有什么建议么?再次感谢,感谢您的回复。
  • 啊,还有一件事。我确实使用重复报告来检查 id 是否有任何可能的重复项。没有找到,所以这似乎不是问题。
【解决方案2】:

所以,Dimitriy 对 vlookup 的建议是完美的,但它对我不起作用。在使用我的数据集、Dimitriy 用于他的示例的 UCLA 数据以及我创建的玩具数据集尝试 vlookup 之后,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

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

【讨论】:

  • 您的文件路径显然包含空格。因此,对本地保存临时文件名的引用应使用双引号 "",就像您为使用的真实文件名所做的那样。
  • 啊,这可能就是 vlookup 无法正常工作的原因。接得好。我的马虎。
  • 如果我是对的,这样的bug以前没有被挠过,真是令人惊讶。
  • 您可以将 tmp 目录设置为指向您的特殊文件夹,例如 this
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多