使用stringdist和dplyr在R中进行字符串匹配

guz6ccqo  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(176)

我尝试使用stringdist函数匹配 Dataframe 中的两列药物名称,但无法获得所需结果。
我有一个数据框架,其中包含某人提供的原始药物名称,然后我有一个包含官方药物名称及其相应代码的列。

df <- data.frame(orig_names = c("KOGENATE", "KOGENATE", "ADVATE", "ADVATE"),
                 desired_names = c("KOGENATE FS", "ADVATE", "ADVATE", "RECOMBINATE"),
                 desired_names_code = c(1,2,3,4))

我希望仅保留那些具有最佳匹配的列,以便生成以下数据框

desired_df <- data.frame(orig_names = c("KOGENATE", "ADVATE"),
                         desired_names = c("KOGENATE FS", "ADVATE"),
                         desired_names_code = c(1,3))

我尝试过使用stringdist包中的各种方法,也尝试过改变距离度量,但结果差别很大。

library(stringdist)

result <- df %>% 
  filter(stringdist::stringdist(orig_names,desired_names, method = "jw") > 0.5)

如有任何建议,我们将不胜感激。

uxhixvfz

uxhixvfz1#

我认为模糊匹配的方法是正确的。使用fuzzyjoin包可以让你连接(分开的)orig_names和desired_names,然后为每个desired_names找到最接近的匹配。这是一个有点奇怪的输出,因为你在desired_names中有两个“ADVATE”,但我仍然认为这是最干净的解决方案。

library(fuzzyjoin)

df1 <- df %>% select(orig_names)
df2 <- df %>% select(-orig_names)

stringdist_join(df1, df2,
                by = c('orig_names' = 'desired_names'),
                mode = 'right',
                method = 'jw',
                max_dist = 99,
                distance_col = 'dist') %>% 
  group_by(desired_names) %>% 
  slice_min(order_by = dist, n = 1) %>% 
  distinct()

# A tibble: 4 x 4
# Groups:   desired_names [3]
  orig_names desired_names desired_names_code   dist
  <fct>      <fct>                      <dbl>  <dbl>
1 ADVATE     ADVATE                         2 0     
2 ADVATE     ADVATE                         3 0     
3 KOGENATE   KOGENATE FS                    1 0.0909
4 KOGENATE   RECOMBINATE                    4 0.290
lskq00tm

lskq00tm2#

我能够使用{stringr}中的str_detect实现我想要的结果

result <- df %>% 
  filter(stringr::str_detect(desired_names, pattern = orig_names)

相关问题