Объединить 2 data.tables для нескольких нечетких совпадений - PullRequest
2 голосов
/ 11 октября 2019

У меня есть 2 data.tables, которые имеют не относящиеся к делу имена переменных в неоднозначном порядке:

enter image description here

Я хочу объединить 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):

enter image description here

1 Ответ

0 голосов
/ 11 октября 2019

Не знаю, правильно ли я понимаю ваш вопрос. Но как насчет генерации отсортированного идентификатора слияния. Идентификатор объединения может быть использован.

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...