Select 来自不同 Table 的行,其中第 1 table 列的字符串出现在 R 中

Select Rows from Different Table where String from 1st table column is present in R

我正在尝试匹配 tables,如果一个字符串完全存在于另一个 tables 的列中。但是,我已经设法部分加入它,然后我应用 Levenstein 距离来获得近距离匹配。这种方法的使用和准确性有限。方法:

checkg <- check %>% 
  fuzzy_inner_join(LOCATIONS, by = c("STRING" = "STRING"), match_fun = str_detect) %>%
  rowwise() %>%
  mutate(DIST = adist(x=STRING, y=LOCATION, ignore.case = TRUE)) 

有没有什么办法可以按下面的方式映射呢?输出 table 中的 STATUS 列只是为了明确部分字符串匹配不是 objective。输出中不需要它。谢谢

TABLE 1

**STRING** 
BATANGAS
QINGDAO

TABLE2

**STRING**
BATNAGAS LUZON
QINGDAO PT

OUTPUT TABLE checkg

TABLE1.STRING   TABLE2.STRING    STATUS
BATANGAS        BATNAGAS LUZON   Accept
QINGDAO         QINGDAO PT       Accept
BATANGAS        TANGA            Reject

这取决于您的表格的性质,但总的来说这是我想出的解决方案:

Table1 <- data.table(STRING = c("BATANGAS", "QINGDAO"))
Table2 <- data.table(STRING = c("BATANGAS LUZON", "QINGDAO PT", "TANGA"))

Table3 <- as.data.table(stringdist_join(Table1, Table2, by = "STRING", max_dist = 6, method = "lv", 
                                        mode = "full", distance_col = "STATUS"))

我对 dplyr 不够熟悉,无法在那里复制它,所以我在示例中使用 data.table。

此代码将产生以下结果:

STRING.x    STRING.y          STATUS
BATANGAS    BATANGAS LUZON    6
BATANGAS    TANGA             3
QINGDAO     QINGDAO PT        3
QINGDAO     TANGA             4

现在有点棘手了。我可以想象您不希望 TANGA 与 STRING.x 中的两个不同值匹配。然而,在这个例子中,您确实希望 BATANGAS 与 STRING.y 中的 2 个不同值相匹配。如果你想 总是 从 STRING.y 中删除重复项,你可以使用这个:

Table3 <- Table3[ , .SD[which.min(STATUS)], by = STRING.y]

这将产生:

STRING.y          STRING.x    STATUS
BATANGAS LUZON    BATANGAS    6
TANGA             BATANGAS    3
QINGDAO PT        QINGDAO     3

您可以反转语法以避免从 LOCATIONS table.

进行部分匹配
library(fuzzyjoin)

check <- data.frame(STRING = c("BATANGAS", "QINGDAO"))
LOCATIONS <- data.frame(STRING = c("BATANGAS LUZON", "QINGDAO PT", "TANGA"))

LOCATIONS %>% 
  fuzzy_right_join(check, by = c("STRING" = "STRING"), match_fun = str_detect)

        STRING.x STRING.y
1 BATANGAS LUZON BATANGAS
2     QINGDAO PT  QINGDAO

要进一步检查完整单词,您可以这样做..

check <- structure(list(To_check = c("BATANGAS", "QINGDAO", "ABC", "DEF"
), id = 1:4), class = "data.frame", row.names = c(NA, -4L))

check
> check
  To_check id
1 BATANGAS  1
2  QINGDAO  2
3      ABC  3
4      DEF  4

> LOCATIONS
          STRING
1 BATANGAS LUZON
2     QINGDAO PT
3          TANGA
4           ABCD

LOCATIONS %>% 
  fuzzy_right_join(check %>% mutate(dummy = paste0('\b', To_check, '\b')), 
                   by = c("STRING" = "dummy"), match_fun = str_detect) %>%
  select(-dummy)

          STRING To_check id
1 BATANGAS LUZON BATANGAS  1
2     QINGDAO PT  QINGDAO  2
3           <NA>      ABC  3
4           <NA>      DEF  4

不用说你可以使用 fuzzy_inner_join 只有匹配的结果