【发布时间】:2017-09-22 16:11:19
【问题描述】:
我正在尝试根据部分字符串匹配合并两个不同大小的相当大的数据帧。
df1$code 包含所有 12 位代码,而 df2$code 包含 10-12 位代码的混合,其中一些较短的代码是与 df1$code 中的 12 位代码匹配的子字符串。
因此,我需要合并两个数据帧之间的所有 12 位匹配,还需要合并 df2 中具有 10-11 位代码的记录,这些记录是与 df1 匹配的子字符串。
示例数据框:
df1 <- data.frame(code_1 = c('123456789012', '210987654321', '567890543211', '987656789001', '123456654321', '678905432156', '768927461037', '780125634701', '673940175372', '167438501473'),
name = c('bob','joe','sally','john','lucy','alan', 'fred','stephanie','greg','tom'))
df2 <- data.frame(code_2 = c('123456789012','2109876543','7890543211','98765678900','12345665432','678905432156'),
color = c('blue', 'red', 'green', 'purple', 'orange', 'brown'))
df3 (merged)
code_1 code_2 name color
123456789012 123456789012 bob blue
210987654321 2109876543 joe red
567890543211 7890543211 sally green
987656789001 98765678900 john purple
123456654321 12345665432 lucy orange
678905432156 678905432156 alan brown
【问题讨论】:
-
我们可以简单地将每个代码截断为 10 位长度,然后匹配吗?
-
你也想要python解决方案吗?在其他人编辑之前,您最初包含了一个 python 标签。
-
不应该
'7890543211'匹配'567890543211'?还是您只关心出现在 12 位数字开头的子字符串? -
@user 如果您的示例是所需的结果,您可以使用
sapply(df1$code, agrep, df2$code,value=TRUE)来获取匹配值。我不知道如何从列表返回到加入。 -
抱歉,已更正字段。我无法截断为 10 位数字,因为有些从开头和结尾都缺少数字(有些从开头和结尾都缺少一个数字)。我可以使用 R 或 Python 答案。谢谢!