按共享模式合并数据框行
Merge dataframes rows by shared pattern
我想根据共享模式合并 2 个数据帧。
模式为ID名称(此处为粗体):ID=HAND2;ACS=20 as "ID=(. +);ACS
如果 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
我想根据共享模式合并 2 个数据帧。
模式为ID名称(此处为粗体):ID=HAND2;ACS=20 as "ID=(. +);ACS
如果 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