代码之家  ›  专栏  ›  技术社区  ›  marine8115

从不同的表中选择行,其中第一个表列中的字符串出现在R中

  •  0
  • marine8115  · 技术社区  · 5 年前

    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)) 
    

    有没有什么方法可以用下面的方法来绘制地图?输出表中的STATUS列只是为了说明部分字符串匹配不是目标。输出中不需要它。谢谢

    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
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   AnilGoyal    4 年前

    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 因为只有匹配的结果

        2
  •  0
  •   koolmees    5 年前

    这取决于表的性质,但通常这是我提出的解决方案:

    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不够熟悉,无法在那里复制它,所以我使用数据表在我的例子中。

    此代码将产生以下结果:

    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中的两个不同值匹配 总是 从字符串中删除重复项。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