在R/Python中,部分匹配两个具有公共列(按字)的数据帧
我有两个数据帧作为csv文件,其中在R/Python中,部分匹配两个具有公共列(按字)的数据帧,python,regex,r,agrep,Python,Regex,R,Agrep,我有两个数据帧作为csv文件,其中df1的行数多于df2: Df1 Name Count xxx yyyyyy bbb cccc 15 fffdd 444 ggg 20 kkbbb ccc dd 29p 5 22 cc pbc2 kmn3 b23 efgh 4 ccccccccc sss qqqq 2 Df2 Name xxx yyyyy
df1
的行数多于df2
:
Df1
Name Count
xxx yyyyyy bbb cccc 15
fffdd 444 ggg 20
kkbbb ccc dd 29p 5
22 cc pbc2 kmn3 b23 efgh 4
ccccccccc sss qqqq 2
Df2
Name
xxx yyyyyy bbb cccc
ccccccccc sss qqqq pppc
22 cc pbc2 kmn3 b23,efgh
我想通过匹配前两个或三个单词来进行部分匹配(近似/模糊匹配)。基本上,输出如下:
输出:
Name Count
xxx yyyyyy bbb cccc 15
22 cc pbc2 kmn3 b23 efgh 4
ccccccccc sss qqqq 2
通过尝试精确匹配,我丢失了一些行。我在R中尝试了
agrep
,但不知怎么的,它不起作用,模糊匹配相当慢。请给我推荐一种在R或python中实现这一点的方法。感谢您的帮助 在R中,可以使用agrep
进行模糊匹配。您可以使用max.distance
参数设置匹配允许的最大距离
DF1[sapply(DF2$Name, agrep, DF1$Name, max.distance = 0.2), ]
# Name Count
# 1 xxx yyyyyy bbb cccc 15
# 5 ccccccccc sss qqqq 2
# 4 22 cc pbc2 kmn3 b23 efgh 4
数据:
DF1 <- read.table(text = "Name Count
'xxx yyyyyy bbb cccc' 15
'fffdd 444 ggg ' 20
'kkbbb ccc dd 29p' 5
'22 cc pbc2 kmn3 b23 efgh' 4
'ccccccccc sss qqqq' 2", header = TRUE, stringsAsFactors = FALSE)
DF2 <- read.table(text = "Name
'xxx yyyyyy bbb cccc'
'ccccccccc sss qqqq pppc'
'22 cc pbc2 kmn3 b23,efgh'", header = TRUE, stringsAsFactors = FALSE)
DF1谢谢!!我使用的是相同的代码,但是当数据量很大时,它的速度非常慢。你知道其他更快的方法吗?@warwick12不幸的是,模糊匹配速度很慢。您可以尝试一种迭代方法,从可能的匹配集中删除匹配项,以减少每个步骤中的比较次数。当然,你必须记住原来的行号。回答得好。stringdist()是否仅适用于数字匹配?谢谢!我得到了这个错误。您知道此错误的可能原因吗:[.default
(xj,i)中的错误:无效的下标类型“list”?@warwick12我想算法找到了一个以上的字符串匹配项。