2015-10-27 60 views
0

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

我想带个人并创建一个变量,这些变量是每个朋友的外国出生地位。

我已经有一个指标,每个人是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列之间。我希望这更清楚一点。

+3

由于缺乏任何示例数据,我只会提出,想到的解决方案将使用“合并”和最有可能的“重塑长”。你所描述的拟人化解决方案(Stata看起来,向下看,输入到原始)不是,我希望,你正在计划实施什么,但只是描述一个人,而不是Stata,可能会创造所需结果。 –

回答

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

好的提示。 'net install vlookup,(http://www.stata.com/users/kcrow)'是如何安装的。 –

+0

以前我不知道,即使在统计员和堆栈溢出之后的一年之后。很好,利用别人的工作比写自己的工作更容易。 'view vlookup.ado'显示了一些非常干净的代码,这是Stata的有效教训。 –

+0

谢谢大家!除了Dimitriy的例子,我安装了vlookup并查看了它提供的帮助文件。帮助文件中的示例本身似乎完成了我正在尝试执行的操作。我把下面的语法放在我的do文件中 – Jonathan

0

所以,VLOOKUP的Dimitriy的建议是完美的,除了它不会为我工作。在使用我的数据集,Dimitriy用于他的示例的UCLA数据以及我创建的vlookup的玩具数据集尝试使用vlookup后,程序尝试将临时文件保存到我的临时文件夹时始终失败。以下是vlookup的程序。注意它设置tempfile文件,操纵数据,然后保存文件。

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

 
\t } 
 
end 
 
exit

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

clear all 
 
set more off 
 
capture log close 
 

 

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

 

 
program define justlinkit, sortpreserve 
 
\t syntax varname, Generate(name) Key(varname) Value(name) 
 
\t qui { 
 
preserve 
 
\t tempvar g _merge 
 
\t sort `key' 
 
\t by `key' : keep if _n ==1 
 
\t keep `key' `value' 
 
\t sort `key' 
 
\t rename `key' `varlist' 
 
\t rename `value' `generate' 
 
\t 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' 
 

 
\t } 
 
end 
 

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

 
sort aid 
 
list

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

+0

您的文件路径显然包含空格。因此,引用临时文件名的本地应该用'''''双引号,就像你为你使用的真实文件名一样。 –

+0

啊,的确,这可能是为什么vlookup不起作用。接得好。对我来说马虎。 – Jonathan

+0

如果我说得对,那么这样的错误之前没有被发现过,真是令人惊讶。 –