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
只有匹配的结果
我正在尝试匹配 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
只有匹配的结果