按共享模式合并数据框行

Merge dataframes rows by shared pattern

  1. 我想根据共享模式合并 2 个数据帧。

  2. 模式为ID名称(此处为粗体):ID=HAND2;ACS=20 as "ID=(. +);ACS

  3. 如果 ID 在两个数据框中都匹配,则合并相应的行!

DF1                   DF2                  MERGED ( DF2 + DF1 )

col1  col2      col1  col2                 col1  col2             col3  col4
HAND2 H2        OFS   ID=GATA5;ACS=45      OFS   ID=GATA5;ACS=45
HAND6 H6        FAM   ID=HAND2;ACS=20      FAM   ID=HAND2;ACS=20  HAND2   H2

本例匹配(HAND2)ID,则DF1、DF2匹配行为combined/merged.


脚本已尝试

MERGED <- merge(data.frame(DF1, row.names=NULL), data.frame(DF2, row.names=NULL), by = ("ID=(.+);ACS"), all = TRUE)[-1]

错误

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

我正在努力寻找一个类似的命令,除了列名,我可以通过共享模式匹配数据帧行。

在此先感谢您的帮助。

你可以试试fuzzyjoin。在 match_fun 参数中,您可以为您的特定需求定义一个函数。

在您的例子中,gsub 正在提取 DF2 col2 变量的模式。并使用 str_detect 将提取与 DF1 的 col1 列进行比较。

数据

DF1 <- read.table(text = "col1  col2 
HAND2 H2  
HAND6 H6", header = T) 

DF2 <- read.table(text = "col1  col2
OFS   ID=GATA5;ACS=45
FAM   ID=HAND2;ACS=20", header = T)

代码

library(fuzzyjoin)
library(stringr)

DF2 %>% 
  fuzzy_left_join(DF1, 
                  by = c("col2"= "col1"),
                  match_fun = function(x,y) str_detect(y, gsub("ID=(.+);(.*)", "\1", x)) )

输出

  col1.x          col2.x col1.y col2.y
1    OFS ID=GATA5;ACS=45   <NA>   <NA>
2    FAM ID=HAND2;ACS=20  HAND2     H2