合并数据
先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。
append
垂直合并两个数据
Stata
append using data2R 包: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 data2R 包:dplyr
cross_join(data1, data2)与 Stata 有差异 cross_join() 为重名列加后缀;Stata cross 对重名列保留主数据值。获得相同列前须先处理重名。
joinby
在每个 id 内形成所有配对
Stata
joinby id using data2R 包:dplyr
inner_join(data1, data2, by = "id", relationship = "many-to-many")与 Stata 有差异 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。
merge
根据行的位置,水平合并两个数据
Stata
merge 1:1 _n using data2R 包:dplyr
bind_cols(data1, data2)与 Stata 有差异 bind_cols() 要求行数相同(或可回收单行)并修复重名列;merge 1:1 _n 可保留未匹配行。
根据 id 一对一合并,并报告匹配结果
Stata
merge 1:1 id using data2R 包:tidystata
stata_merge(data1, data2, "1:1", by = "id")与 Stata 一样保留所有个案,并生成记录匹配结果的 .merge 变量。full_join(data1, data2, by = “id”) 合并但不报告。
根据 id 一对多合并
Stata
merge 1:m id using data2R 包:tidystata
stata_merge(data1, data2, "1:m", by = "id")根据 id 多对一合并
Stata
merge m:1 id using data2R 包: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) nogenerateR 包: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) nogenerateR 包: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, nogenerateR 包:dplyr
full_join(data1, data2, by = c("id1", "id2"))与 Stata 有差异 两个数据中同名的变量会加上后缀,可用 suffix = c(“_data1”, “_data2”) 指定。 dplyr 为重名非键列加后缀而非保留 Stata 主数据值,不创建 _merge,也不执行声明的 1:1 键约束。