我有 20 多个不同的数据表,其中的数据由相同的编码系统(北美行业分类系统,NAICS)索引,我想将它们连接到一个表中。
问题是每个表中都有不同级别的详细信息,当我加入时,我希望通过失败编码系统的层次结构直到找到匹配来找到最佳匹配。
一个常规的left_join
不会起作用,因为并不总是完全匹配。我已经看过了fuzzyjoin
包,但这有点超出我的能力范围。
我想从一个代码表开始:
t_master
# A tibble: 360 x 1
NAICS17
<chr>
1 311111
2 311119
3 311211
4 311212
5 311213
6 311221
7 311224
8 311225
9 311230
10 311313
# ... with 350 more rows
t_master <- structure(list(NAICS17 = c(311111L, 311119L, 311211L, 311212L,
311213L, 311221L, 311224L, 311225L, 311230L, 311313L)), row.names = c(NA,
-10L), class = "data.frame")
然后循环遍历所有其他表,找到每个表中的最佳可用匹配,然后连接所有变量。有时这很简单,因为存在完全匹配(t_asm 中的 311111 和 311119 将连接到 t_master 中的 311111 和 311119):
t_asm
# A tibble: 8,167 x 3
NAICS17 CEXBLD CEXMCH
<chr> <chr> <chr>
1 31-33 16806796 96986337
2 311 2099542 9063451
3 3111 92429 517196
4 31111 92429 517196
5 311111 49756 225494
6 311119 42673 291702
7 3112 192911 1016770
8 31121 75310 267693
9 31121M 75310 267693
10 31122 94339 546407
# ... with 8,157 more rows
t_asm <- structure(list(NAICS17 = c("31-33", "311", "3111", "31111", "311111",
"311119", "3112", "31121", "31121M", "31122"), CEXBLD = c("16806796",
"2099542", "92429", "92429", "49756", "42673", "192911", "75310",
"75310", "94339"), CEXMCH = c("96986337", "9063451", "517196",
"517196", "225494", "291702", "1016770", "267693", "267693",
"546407")), row.names = c(NA, -10L), class = c("tbl_df", "tbl",
"data.frame"))
但有时我希望它寻找最佳匹配,即使不太详细(t_brdis_2015 中的 311 将连接到 t_master 中的 311111 和 311119)
t_brdis_2015
# A tibble: 90 x 3
NAICS17 rdcost_total rdcost_wage
<chr> <chr> <chr>
1 0 355821 204170
2 31 236132 129375
3 32 236132 129375
4 33 236132 129375
5 311 4838 2945
6 312 1002 532
7 313 748 481
8 314 748 481
9 315 748 481
10 316 748 481
# ... with 80 more rows
t_brdis_2015 <- structure(list(NAICS17 = c("0", "31", "32", "33", "311", "312",
"313", "314", "315", "316"), rdcost_total = c("355821", "236132",
"236132", "236132", "4838", "1002", "748", "748", "748", "748"
), rdcost_wage = c("204170", "129375", "129375", "129375", "2945",
"532", "481", "481", "481", "481")), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -10L))
这将是左连接,我希望 t_master 的所有观察结果仅与其他数据表中的一个观察结果连接起来。
故障恢复的方法是(以 311111 为例):
- 尝试311111
- 尝试31111
- Try 3111
- Try 311
- Try 31
- Try 3
- 返回 NA
谢谢,如果有任何不清楚的地方请告诉我。