R 函数在 left_join 中进行故障恢复?

2024-02-19

我有 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

谢谢,如果有任何不清楚的地方请告诉我。


我会执行一系列更新连接:

library(data.table)

ncs  = seq_len(max(nchar(t_master$NAICS17)))
nms  = copy(names(t_asm))
xnms = sprintf("x.%s", nms)
tnms = replace(nms, nms == "NAICS17", "m")

t_asm2 <- data.table(t_asm)
out = data.table(t_master)
out[, NAICS17 := as.character(NAICS17)]
out[, m := NA_character_]
for (nc in rev(ncs)){
  out[is.na(m), target := substr(NAICS17, 1, nc)]
  out[is.na(m), 
    (tnms) := t_asm2[.SD, on=.(NAICS17 = target), mget(xnms)][]
  ]
  if (!anyNA(out$m)) break
}
out[, target := NULL][]

    NAICS17      m  CEXBLD  CEXMCH
 1:  311111 311111   49756  225494
 2:  311119 311119   42673  291702
 3:  311211  31121   75310  267693
 4:  311212  31121   75310  267693
 5:  311213  31121   75310  267693
 6:  311221  31122   94339  546407
 7:  311224  31122   94339  546407
 8:  311225  31122   94339  546407
 9:  311230   3112  192911 1016770
10:  311313    311 2099542 9063451

m是匹配的值;target是我们在循环的当前迭代中尝试匹配的值。迭代从最长的代码开始向后进行。 (看着rev(ncs)正在迭代。)

通过过滤到is.na(m),我们将跳过在早期迭代中已匹配的行。考试anyNA(out$m)如果每一行都匹配,允许我们提前退出。

copy只是为了避免出现问题而采取的措施为什么 data.table 会通过引用更新名称(DT),即使我分配给另一个变量? https://stackoverflow.com/q/15913417

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 函数在 left_join 中进行故障恢复? 的相关文章

  • 如何更改数据表中的少数列名称

    我有一个包含 10 列的数据表 town tc one two three four five six seven total 需要生成我正在使用的列 一 到 总计 的平均值 DTmean lt DT lapply SD mean by t
  • 用于带有嵌套子图的图的 r 包? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用于图形 网络的 r 包 它可以处理嵌套子图 Graphviz 做到了这一点 但只提供可
  • dmvnorm MVN 密度 - RcppArmadillo 实现比 R 包慢,包括一些 Fortran

    The solution现已上线RCPP画廊 http gallery rcpp org articles dmvnorm arma 我从 RcppArmadillo 中的 mvtnorm 包重新实现了 dmvnorm 我有点喜欢犰狳 但我
  • 读取并绘制从大文件中读取的数据

    我们有相当大的文件 大约为 1 1 5 GB 主要是日志文件 其中包含易于解析为 csv 的原始数据 随后应该将其绘制成图表以生成一组图形图像 目前 我们正在使用 bash 脚本将原始数据转换为 csv 文件 其中仅包含需要绘制图表的数字
  • 自定义 colorRampPalette 中的颜色条

    我定义了一个 colorRampPalette my colors colorRampPalette c light green yellow orange red 如何为其绘制颜色条 图例 项目 最好仅使用基本包 我正在寻找一个充满该颜色
  • 生成因子变量水平的预测值

    我正在使用连续结果变量对多个因子变量进行回归lm 例如 fit lt lm dv factor hour factor weekday factor month factor year count data df 我想生成预测值 yhat
  • 使用 igraph 将边缘属性显示为标签

    我在 R 中使用 igraph 进行网络分析 我想在图中的每条线上显示边缘属性 下面是一个例子 df lt data frame a c 0 1 2 3 4 b c 3 4 5 6 7 nod lt data frame node c 0
  • 向图像添加坐标,以用作 R 中的 Leaflet、Shiny 和 Shinydashboard 包中的地图

    我计划使用 Leaflet Shiny 和 Shinydashboard 沿着以下很棒的路线创建一个带有医院 OHS 事件标记的交互式地图交互式地图和直方图模板 http shiny rstudio com gallery superzip
  • R dplyr过滤多列上的字符串条件

    我有一个 df 例如 df lt read table text v1 v2 v3 v4 v5 1 A B X C 2 A B C X 3 A C C C 4 B D V A 5 B Z Z D header T 如果变量 v2 到 v5
  • S4 类 [(子集)带有附加参数的继承

    这是一个扩展在 R 中的访问器函数中使用 callNextMethod https stackoverflow com q 24875284 2752888 2017 03 25 更新 为了说明如何仅在加载方法时失败 但在构建的包中时不会失
  • 使用 purrr::map() 更改和分配新变量名称

    我刚刚开始掌握编写函数并使用 lapply purrr map 使我的代码更加简洁 但显然还没有完全理解它 在我当前的示例中 我想重命名 lm robust 对象的系数名称 然后更改 lm robust 对象以合并新名称 我目前这样做 li
  • 计算 R 中数据帧的每一行中特定值的连续出现次数

    我有一个data frame许多位置 这么多行 的变量的每月值 我想计算值为零的连续月份 即连续单元格 的数量 如果只是从左到右阅读 这很容易 但增加的复杂性是年底与年初是连续的 例如 在下面的缩短示例数据集中 用季节而不是月份 位置 1
  • 在 R 中使用 spplot 将多个绘图放在一个页面上?

    我知道如何在使用简单函数图时绘制两个图 old par lt par mfrow c 1 2 plot faithful main Faithful eruptions plot large islands main Islands yla
  • 在嵌套 tibbles 上应用 ntile

    我正在尝试申请ntile在一些嵌套的小标题上 但我似乎无法让它工作 你能看出我错在哪里吗 data iris iris gt group by Species gt mutate quintile ntile Petal Length 5
  • 在 R 中按组检查重叠开始和结束时间

    我想检查数据的重叠 这是数据 ID lt c rep 1 3 rep 3 5 rep 4 4 rep 5 5 Begin lt c 0 2 5 3 7 8 7 25 25 10 15 17 20 1 NA 10 11 13 End lt c
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • 按具有作业的组划分的 R 分位数

    我有以下 df group rep seq 1 3 30 variable runif 90 5 0 7 5 df data frame group variable 我需要 i 按组定义分位数 ii 将每个人分配到相对于其组的分位数 因此
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f

随机推荐