R使用字符串匹配匹配数据表

时间:2017-05-02 15:06:05

标签: r data.table string-matching

我有两个数据表:

dt1 <- data.table(V1=c("Apple Pear Orange, AAA111", "Grapes Banana Pear .BBB222", "Orange Kiwi Melon ,CCC333.", "Apple DDD444, Pear Orange", "Kiwi Melon Orange, CCC333", "Apple Pear Orange, AAA111", "Tomato Cucumber-EEE222", "Seagull Pigeon ZZZ111" ), stringsAsFactors = F)

dt2 <- data.table(Code=c("AAA111", "AAA222", "AAA333", "AAA444", "AAA555", "AAA666", "BBB111", "BBB222", "BBB333", "BBB444", "BBB555", "BBB666", "CCC111", "CCC222", "CCC333", "CCC444", "CCC555", "CCC666", "DDD111", "DDD222", "DDD333", "DDD444", "DDD555", "DDD666", "EEE111", "EEE222", "EEE333", "EEE444", "EEE555", "EEE666"), stringsAsFactors = F)
dt2$Ref <- 1:nrow(dt2)

dt1中的每一行都包含一个包含“代码”的无格式字符串。 dt2包含可以匹配的代码列表。我所追求的是一种方法,可以识别dt1每行中字符串的“代码”部分,然后与dt2中的相应代码进行匹配。如果dt2中没有匹配的代码,则返回NA。

以下是我的输出类型:

dt3 <- data.table(V1=c("Apple Pear Orange, AAA111", "Grapes Banana Pear .BBB222", "Orange Kiwi Melon ,CCC333.", "Apple DDD444, Pear Orange", "Kiwi Melon Orange, CCC333", "Apple Pear Orange, AAA111", "Tomato Cucumber-EEE222", "Seagull Pigeon ZZZ111"), Code=c("AAA111", "BBB222", "CCC333", "DDD444", "CCC333", "AAA111", "EEE222", "NA"), Ref=c("1", "8", "15", "22", "15", "1", "26", "NA"), stringsAsFactors = F)

我已经尝试过使用正则表达式,grep等来找到解决方案但没有任何地方。

1 个答案:

答案 0 :(得分:1)

您可以使用我的fuzzyjoin包中的regex_left_join

library(fuzzyjoin)
regex_left_join(dt1, dt2, by = c(V1 = "Code"))
#>                            V1   Code Ref
#> 1:  Apple Pear Orange, AAA111 AAA111   1
#> 2: Grapes Banana Pear .BBB222 BBB222   8
#> 3: Orange Kiwi Melon ,CCC333. CCC333  15
#> 4:  Apple DDD444, Pear Orange DDD444  22
#> 5:  Kiwi Melon Orange, CCC333 CCC333  15
#> 6:  Apple Pear Orange, AAA111 AAA111   1
#> 7:     Tomato Cucumber-EEE222 EEE222  26
#> 8:      Seagull Pigeon ZZZ111     NA  NA