Description
merge将来自当前内存中的数据集(称为masterdataset)的相应观察值与来自filename.dta(称为using dataset)的数据集连接起来,匹配一个或多个关键变量。
merge可以执行匹配合并(一对一,一对多,多对一和多对多),这些通常称被数据库人员的联接。 合并也可以执行顺序合并,在关系数据库世界中没有等价物。
merge 用于将第二个数据集中的新变量添加到现有观察中。 例如,在合并医院患者和出院数据集时,您可以使用合并。如果你希望向现有变量添加新的观察值,请参见[D]append。例如,在将当前放电添加到过去的放电时,可以使用追加。
默认情况下,合并会创建一个新变量merge,该变量包含与合并数据集中每个观察值的来源和内容相关的数字代码。这些代码将在下面的
匹配结果表。
关键变量不能是 strLs.
果指定的filename没有扩展名,则假定为.dta。
Syntax
对指定的键变量进行一对一合并
merge 1:1 varlist using filename [, options]
对指定的关键变量进行多对一合并
merge m:1 varlist using filename [, options]
对指定的关键变量进行一对多合并
merge 1:m varlist using filename [, options]
对指定的关键变量进行多对多合并
merge m:m varlist using filename [, options]
通过观察一对一合并
merge 1:1 _n using filename [, options]
选项 | 功能 |
---|---|
keepusing(varlist) | 使用数据的部分变量;默认为全部。 |
generate(newvar) | 用于标记合并结果的新变量的名称; 默认是merge。 |
nogenerate | 不创建merge变量。 |
nolabel | 不复制 using data 变量标签定义( value-label )。 |
nonotes | 不要复制 using data 说明(notes)。 |
update | 使用using data 变量的值来更新 master data 中同名变量的缺失值。也就是说,匹配的观测值将 using data 的值更新到 master data 中缺少的值,master data 中不缺少的值将保持不变。 |
replace | 使用 using data 中的非缺失值替换 master data 中所有同名变量的值(需要更新)。也就是说,匹配的观察值将全部包含来自using data 的值,除非缺少 using data中的值。 |
noreport | 不显示匹配结果汇总表 |
force | 强制字符串/数字变量类型匹配而不会出错。但是会导致来自 using data 中的值丢失。如果省略force 合并将发出错误;如果指定force ,合并将发出警告。 |
assert(results) | 指定所需的匹配结果。 |
keep(results) | 指定要保留的匹配结果。 |
sorted | 不要排序;数据集已排序。 |
Remarks
1:1 merges
示例称为1:1合并,因为关键变量唯一地标识每个数据集中的每个观察值。如果变量的每个不同值对应于数据集中的一个观察值,则变量或变量列表唯一地标识观察值。 在一些数据集中,需要多个变量来识别观察结果。 想象一下通过在特定时间点观察患者获得的数据,以便变量 pid 和 time 一起识别观察结果。 下面我们有两个这样的数据集,并在 pid 和 time 上运行1:1合并,
这是1:1合并,因为 pid 和 time 值的组合唯一地标识两个数据集中的观察结果。
默认情况下,1:1的合并并不意味着所有,甚至任何一个观察结果都匹配。 以上五个观察结果来自共同匹配,一个观察结果仅来自 master data(subject 14 at time 4),另一个仅来自 using data(subject 17 at time 2)。
m:1 merges
在m:1合并中,一个或多个关键变量唯一地标识 using data 中的观察值,但不一定在 master data 中。 假设你有 regions data 和person-level data,希望引入区域数据。 这是一个例子:
为了获取 regions 信息,我们需要在 regions 上进行合并。区域值识别 using data 中的单个观测值,但它不是 master data 中的标识符。
我们显示按id排序的合并数据集,因为这样可以更容易地查看merge dataset的构造方式。对于 master data 的每个观察值,merge 找到相应的 using data 观察值。merge将 using data 中的变量值与 master data 中的观察值组合在一起。
1:m merges
1:m合并类似于m:1,但现在关键变量识别 master data 中的唯一观察值。可以使用m:1合并的任何数据集,也可以使用1:m合并,通过反转 master data和 using data 来合并。以下是与先前使用的相同的示例,其中 master 和using数据集相反:
除了排序顺序和合并内容之外,此合并结果与上一节中的合并结果相同。这一次,我们将显示按 region 而不是 id 排序的合并结果。反转文件的角色导致 _merge 的1和2反转:其中上面 merge 合并为1,现在为2,反之亦然。这些交换的 merge 值反映了master data 和 using data 的相反角色。
m:m merges
m:m指定多对多合并,这是一个坏主意。 在m:m合并中,观察值在关键变量的相等值内匹配,第一个观察值与第一个观察值匹配; 该
第二,到第二; 等等。 如果 master data 和 using data 在组内有不等数量的观察值,则重复使用较短组的最后一次观察以匹配,随后对较长组的观察。 因此m:m合并依赖于当前的排序顺序 - 这种情况永远不会发生。
因为m:m合并是一个坏想法(bad idea),这里不给例子。 如果您认为需要m:m合并,那么您可能需要处理 using data ,以便可以使用1:m或m:1合并。 有关此问题的提示在下面 Troubleshooting m:m merges 中给出。
Sequential merges
在顺序合并中,没有关键变量。 观察结果仅与其观察数相匹配:
在上面的例子中,using data 比 master data 要长,但是也可以相反。在大多数情况下,在适当的顺序合并中,数据集应该具有相同的长度
像m:m合并一样,顺序合并是危险的。两者都取决于数据的当前排序顺序。
Treatment of overlapping variables
执行任何类型的合并时,master data 和 using data 可能具有除关键变量之外的共同变量。 我们将这些变量称为重叠变量。 例如,如果master data 和 using data 的变量是
而id是关键变量,然后重叠变量是性别和种族。
默认情况下,merge 将 master data 中的观察值视为不可侵犯。 当观察值匹配时,它是合并结果中记录的重叠变量的nmaster值。
但是,如果指定update option,则匹配观察中的重叠变量的所有缺失值将替换为 using data 中的值。 由于这种新行为,合并代码会有所改变。 代码1和2保留其旧的含义。 代码3分成代码3,4和5.根据以下规则对代码3,4和5进行过滤。 第一个适用的规则用来。
5对应于匹配的观察结果,其中至少一个重叠变量具有冲突的非缺失值。
4对应于匹配的观察,其中至少一个缺失值被更新,但没有冲突的非缺失值。
3表示匹配的观察结果,既没有更新的缺失值也没有冲突的非缺失值。
如果同时指定了更新和替换选项,merge == 5 表示使用来自 using data 的值更新。
Examples
Example 1: A 1:1 merge
我们有两个数据集,一个是关于旧汽车大小的信息,另一个是关于其费用的信息:
我们可以看到这些数据集包含有关几乎相同汽车的不同信息。我们希望将有关所有汽车的所有信息整合到一个数据集中。因为我们要向旧变量添加新变量,所以这是 merge 命令的工作。 我们只需要决定我们需要什么类型的匹配合并。
仔细查看数据集,我们看到make变量(用于标识两个数据集中每个数据集中的汽车)还可以识别数据集中的各个观测值。 这意味着如果你告诉我汽车的品牌,我可以告诉你与汽车相对应的一个观察结果。因为两个数据集都是如此,我们应该使用1:1合并。
我们将从头开始展示整个过程:
合并成功 - 所有数据都存在于组合数据集中,即使是来自仅具有尺寸信息的一辆车也是如此。如果我们只想要那些所有信息都存在的品牌,我们应该放弃合并<3的观察结果。
Example 2: Requiring matches
假设我们使用了与前一个示例相同的设置,但我们错误地认为我们拥有所有汽车的所有信息。我们可以告诉merge,我们只希望通过使用ASSERT选项进行匹配。
merge告诉我们,我们的假设有问题。要查看有多少不匹配,我们可以tabulate merge:
如果我们想列出问题观察,我们可以输入:
如果我们确信所有数据都应该在这两个数据集中完成,我们就必须纠正原始数据集中的不匹配现象。
Example 3: Keeping just the matches
再一次,假设我们拥有与以前相同的数据集,但这次我们希望finadataset 只有那些匹配的观察结果。 我们不在乎是否有错配——重要的是完整的观察结果。通过使用keep(match)选项,我们将保证发生这种情况。因为我们只保留关键变量匹配的那些观察结果,所以不需要生成merge变量。 我们可以做到以下几点:
Example 4: Many-to-one matches
我们有两个数据集:一个是区域销售人员,另一个是区域销售数据。我们想把所有的信息放在一个数据集中。以下是数据集:
我们可以看到将用于匹配的两个数据集中 region 变量的观测值,这次我们看到 region 变量识别 dollars datase 中的单个观测值,但在 sforce dataset 没有标识 。这意味着我们必须使用m:1或1:m合并。 在这里,我们将打开 sforce 数据集,然后合并 dollars 数据集。 这将是m:1合并,因为 region 不标识内存中的数据集中的单个观察值,但在using dataset 中识别它们。
以下是命令及其结果
我们可以从结果中看出,两个数据集中的 region 变量的所有值都是匹配的。 这在实践中很少见!如果我们在内存中有 dollars 数据集并在 sforce 数据集中合并,我们就会完成1:m的合并。
我们现在想要使用一系列示例来说明merge如何处理非关键变量(nonkey variables),非关键变量在两个数据集中具有相同的名称。 我们将这些称为“重叠”的变量。
Example 5: Overlapping variables
以下是两个数据集,其唯一目的是为了说明:
我们可以看到id可以用作将两个数据集放在一起的关键变量。 我们还可以看到有两个重叠的变量:x1和x2。 我们将从一个简单的m:1合并开始:
细检查表明,对于匹配的id,x1和x2的值仍然是最初在 overlap1 数据集中的值。 这是合并的默认行为——master dataset 是权威不可侵犯,保持不变。
Example 6: Updating missing data
现在我们想调查update option。 它本身使用,它将使用来自using data的值替换 master data 中的缺失值:
通过观察查看结果数据集观察,我们可以看到update option 的更新以及合并变量如何获取其值。
以下是显示正在发生的情况的列表,其中x1 m和x2 m来自master dataset(overlap1),x1 u和x2 u来自using dataset(overlap2),x1和x2是当 使用update option 时出现的值
从这里,我们可以看到两个重要的事实:如果同时存在冲突和更新的值,合并的值将反映出存在冲突,并且 master dataset 的缺失值是
由 using dataset 的缺失值更新。
Example 7: Updating all common observations
我们希望看到如果指定了update and replace options 会发生什么。 replace options 扩展 update 的操作以使用 using data 的非缺失值来替换 master data 中的值。 合并的值同时不受 using data update and replace 的影响。
Example 8: More on the keep() option
假设我们想要使用 update option,就像我们上面所做的那样,但我们只想保留那些在两个数据集中都找到关键变量id的值的观察结果。 这将比我们之前的示例更复杂,因为 update option 将匹配分为matches, match updates 和 match conflicts。 我们必须使用所有这些代码字保留选项或使用它们的数字等价物3,4和5.这里后者更简单。我们必须在keep选项中使用所有这些代码字,或者使用它们的数字等价物3,4和5.这里后者更简单。
Example 9: A one-to-many merge
作为最后一个例子,我们想展示一个1:m合并的例子。 这里概念上没有什么不同; 有趣的是最终数据集中观察的顺序:
我们在这里可以看到,前四个观测值来自 master dataset,所有其他观测值,无论是匹配的还是不匹配的,都低于这些观测值。 这说明了 master dataset 始终位于合并数据集的左上角。