data.table 根据切换的字符串组合加入

data.table join based on switched string combinations

我有 df1,我想根据公共字段 id

df2 合并

id 始终采用 21_2342_A_C 的形式(即 num_num_char_char)。如果 id 中的最后两个字段 (sep="_") 中的任何一个被切换,我想将 df2 合并到 df1 中。

所以,如果 df1 中的 ID21_2342_A_C,那么如果 df2 中的条目是 21_2342_A_C 或 [,我希望它匹配=26=].

这可以使用 data.table 吗?我开发了一种繁琐的方法,涉及创建两个不同的列并进行两个不同的连接,但我希望有一个更优雅的解决方案。我也很乐意采用非 data.table 解决方案。

这还包括创建两个额外的列,但只有 1 个合并:

dt <- data.table(
  id = c("21_2342_A_C", "21_2342_C_A", "21_2342_A_B")
)
  1. 提取id的数字和字符部分
  2. 对字符部分进行排序
  3. 如果数字和字符部分相同则合并
  4. 删除自身合并and/or重复合并(如果第 i 行合并到第 j 行,则第 j 行合并到第 i 行)
dt[, row_id := seq_len(.N)]
dt[, (c("id1", "id2")) := transpose(str_extract_all(dt$id, "([0-9]{2}_[0-9]{4})|([A-Z]_[A-Z])"))]
dt[, id2 := map_chr(str_split(id2, "_"), ~str_c(sort(.x), collapse = ""))]
res <- dt[dt, on = .(id1, id2)][row_id < i.row_id]

res[, c("row_id", "id1", "id2", "i.row_id") := NULL]

如果没有中间 ID,我也不知道该怎么做。 这是我的看法:

df1 <- data.table(V1= "hello", id= "21_2342_A_C")
df2 <- data.table(V1= c("world1", "world2"), id= c("21_2342_A_C", "21_2342_C_A"))

sort_id <- function(x)
{
  x <- unlist(tstrsplit(x, "_"))
  return(paste0(c(x[1:2], sort(x[3:4])), collapse= "_"))
}

df1[, id2:= sort_id(id), id]
df2[, id2:= sort_id(id), id]

merge(df1, 
      df2, 
      "id2")