合并数据

先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。

append

垂直合并两个数据

Stata

append using data2

R 包:dplyr

bind_rows(data1, data2)

与 Stata 有差异 bind_rows() 使用 R 类型提升和属性规则;.id 创建字符串来源标记,而 append, generate() 使用数值码。

另有 1 个示例及替代实现

垂直合并并记录每行的来源

Stata

append using data2, generate(source)

R 包:dplyr

dplyr::bind_rows(data1, data2, .id = "source") |> dplyr::mutate(source = as.integer(source) - 1L)

与 Stata 有差异 采用数值来源编码:主数据为零,第一个using数据为一,与Stata append, generate()一致。 bind_rows() 使用 R 类型提升和属性规则;.id 创建字符串来源标记,而 append, generate() 使用数值码。

cross

两个数据所有行的组合

Stata

cross using data2

R 包:dplyr

cross_join(data1, data2)

与 Stata 有差异 cross_join() 为重名列加后缀;Stata cross 对重名列保留主数据值。获得相同列前须先处理重名。

joinby

在每个 id 内形成所有配对

Stata

joinby id using data2

R 包:dplyr

inner_join(data1, data2, by = "id", relationship = "many-to-many")

与 Stata 有差异 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。

merge

根据行的位置,水平合并两个数据

Stata

merge 1:1 _n using data2

R 包:dplyr

bind_cols(data1, data2)

与 Stata 有差异 bind_cols() 要求行数相同(或可回收单行)并修复重名列;merge 1:1 _n 可保留未匹配行。

根据 id 一对一合并,并报告匹配结果

Stata

merge 1:1 id using data2

R 包:tidystata

stata_merge(data1, data2, "1:1", by = "id")

与 Stata 一样保留所有个案,并生成记录匹配结果的 .merge 变量。full_join(data1, data2, by = “id”) 合并但不报告。

根据 id 一对多合并

Stata

merge 1:m id using data2

R 包:tidystata

stata_merge(data1, data2, "1:m", by = "id")

根据 id 多对一合并

Stata

merge m:1 id using data2

R 包:tidystata

stata_merge(data1, data2, "m:1", by = "id")
另有 6 个示例及替代实现

只保留 data1 中的个案

Stata

merge 1:1 id using data2, keep(master match)

R 包:dplyr

left_join(data1, data2, by = "id")

与 Stata 有差异 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。

在 data1 中只保留 id 不在 data2 中的个案

Stata

merge 1:1 id using data2, keep(master) keepusing(id) nogenerate

R 包:dplyr

anti_join(data1, data2, by = "id")

与 Stata 有差异 semi_join()/anti_join() 按键成员关系选择行,但不执行 Stata merge 1:1 的唯一键要求;须另行验证唯一性。

只保留 data1 和 data2 匹配成功的个案

Stata

merge 1:1 id using data2, keep(match)

R 包:dplyr

inner_join(data1, data2, by = "id")

与 Stata 有差异 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。

在 data1 中只保留 id 出现在 data2 中的个案

Stata

merge 1:1 id using data2, keep(match) keepusing(id) nogenerate

R 包:dplyr

semi_join(data1, data2, by = "id")

与 Stata 有差异 semi_join()/anti_join() 按键成员关系选择行,但不执行 Stata merge 1:1 的唯一键要求;须另行验证唯一性。

只保留 data2 中的个案

Stata

merge 1:1 id using data2, keep(using match)

R 包:dplyr

right_join(data1, data2, by = "id")

与 Stata 有差异 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。

根据 id1 和 id2 合并两个数据

Stata

merge 1:1 id1 id2 using data2, nogenerate

R 包:dplyr

full_join(data1, data2, by = c("id1", "id2"))

与 Stata 有差异 两个数据中同名的变量会加上后缀,可用 suffix = c(“_data1”, “_data2”) 指定。 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。