首页 > 解决方案 > 在多个模糊匹配上合并 2 个 data.tables

问题描述

我有 2 个 data.tables 具有不相关的变量名称,顺序不明确:

在此处输入图像描述

我想合并 dt1 和 dt2。但实际上,无论信息在哪一列,我都想加入。

dt3=inner_join(dt1,dt2,by=c('Col1','Col2')) #Won't join all 4;only 2.  

我无法合并这些列,因为实际上有很多(> 100)并且它们不能可靠地被订购)。有没有办法将这些结合起来,以便将所有 4 个观察结果结合起来?

> dput(dt1)
structure(list(Col1 = c("Todd", "Leroy", "Ham", "Tiffon"), Col2 = c("Sally", 
"Brown", "York", "Maude"), Y1 = c(687.4, 12.9, 34.6, 34.6)), row.names = c(NA, 
-4L), class = c("data.table", "data.frame"))
> dput(dt2)
structure(list(Col1 = c("Sally", "Leroy", "York", "Tiffon"), 
    Col2 = c("Todd", "Brown", "Ham", "Maude"), Y1 = c(343.1, 
    5748.6, 942.5, 365.5)), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"))

所需的输出(不要关心它如何输出 Col1,Col2 变量):

在此处输入图像描述

标签: r

解决方案


我不知道,如果我理解你的问题是正确的。但是如何生成一个排序的合并 id。可以使用合并 id。

dt1 <- structure(list(V1 = c("Obs1", "Obs2", "Obs3", "Obs500"), 
               V2 = c("Sally", "Leroy", "York", "Tiffon"), 
               V3 = c("Todd", "Brown", "Ham", "Maude")),row.names =  c(NA, -4L),
               class = c("data.frame"))  
dt1

dt2 <- structure(list(V1 = c("Obs1", "Obs2", "Obs3", "Obs500"), 
               V2 = c("Todd", "Leroy", "Ham", "Tiffon"), 
               V3 = c("Sally", "Brown", "York", "Maude")), row.names =  c(NA, -4L),
               class = c("data.frame"))
dt2

columns <- c("V2","V3")

order_paste <- function (x) {

  x_sorted <- sort(x)
  x_sorted_paste <- paste(x_sorted,collapse = "")
  return(x_sorted_paste)

}

dt1$merge_id <- apply(dt1[columns],1, order_paste)
dt2$merge_id <- apply(dt2[columns],1, order_paste)

dt3<-dplyr::inner_join(dt1,dt2,by=c('merge_id'))

推荐阅读