2013-01-06 54 views
2

我觉得我在这里错过了一些非常基本的东西...
我想合并Stata,FranceSQ.dta和FranceHQ.dta中的两个数据集。他们都有一个我创建的变量,名为“uid”,用于唯一标识观察值。Stata合并改变我的价值观?

use FranceSQ, clear 
merge 1:1 uid using FranceHQ, gen(_merge) keep(match) 

现在令我困惑的是它告诉我uid并不能唯一地识别我的观察结果。我意识到它的发生是,当我打开FranceSQ,一切正常,当我看着自己的UID变量,我有以下值...

25010201 
25010202 
25010203 
... 

但后来当我尝试运行合并,它改变了我所有的价值观,让我看看......

2.50101e+10 
2.50101e+10 
2.50101e+10 
... 

任何帮助将是非常赞赏。我敢肯定有一个简单的答案,但它躲避我的时刻。

*** 编辑 ** *
所以尼克的咨询帮助,谢谢!这是我做错了,所以我想知道是否有人可以指出为什么它不起作用。

1)我通过连接两个数字变量在每个数据集中创建了uid变量,这两个数字变量将uid变量转换为字符串。
2)我跑整个数据集的destring(因为有很多不正确的转换变量),这使得uid变成了双精度。
3)然后我将uid重新设置为一个字符串。正是由于这一点,我无法完成最初的合并。我注意到它改变我所有观察结果的值是数据集中的最后一个值。
4)仅仅因为我在调整,我把uid变量重写为double,并且得到了相同的结果。

现在我终于开始工作了,刚开始时并没有将uid变量重新初始化为一个字符串,但我仍然不知道为什么我以前的努力没有奏效,或者合并命令实际上决定改变我的价值观。

+0

由于存在“重新命令”命令,因此最好不要在此上下文中使用“重新命名”一词。我想你在暗指中间的'tostring'操作,它可能应该包含一个'format()'选项,指定一个可以保留所有数字的数字格式。 –

+0

如果你发布了你的代码,那将是最好的,否则我们只能模糊地猜测你做了什么。 – StasK

回答

2

很可能,这是一个精度问题。长整数需要在longdouble数据类型中进行。您可能需要recastmerge之前的一个标识符。

您应该查看describe的结果,以确定uid在两个数据集中的数据类型是否相同。

+0

呵呵,这样工作。我编辑了OP来描述发生的事情。谢谢! – RickyB

1
  1. 要检查您的变量是否确实能够识别观察值,请输入isid uid。无论如何,在执行merge时,如果uid不是唯一标识符,Stata会投诉,但无论如何,这是一项有用的检查。如果uid通过两个文件中的检查,它应该仍然在合并的文件中;它必须在至少一个源文件中失败才能在合并的文件中失败。
  2. 在Nick Cox关于data types的回答中,问题可能只是格式化。键入describe uid以查明当前格式是什么,可能是format uid %12.0f以摆脱科学记数法。
  3. 我认为Stata会在需要时将变量提升为更准确的格式,例如当您使用非整数值的整数值变量时,比如说replace; merge当你在一个数据集中说byte值,并且你在另一个数据集的相同变量中合并float值时,应该会发生同样的情况。
  4. 缺少uid中的值可能是Stata不相信此变量适用的原因。在merge之前和之后(请参阅我上面提到的关于每种类型的有效范围的help data types)检查这些。
+0

是的,好吧,我设法解决了所有问题。这是一个科学记数法问题......它错误地读取了数值。感谢您的输入! – RickyB