两列数据的部分匹配[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

我的问题是我有一列数据(字符和数字组合),我想检查每个字段是否与不同df的列中的一个字段部分匹配,并且如果它确实写了相应的值第二个df进入第一个变量的新列。

所以更实际:

df1(2x60k)=

QST_ID    QST_CODING
1         M79.68
2         A01.1
3         K07
4         Z09

df2(2x2451)=

icd    name
A01    intestinal diseases
...
K07    Diseases of oral cavity

目标是让df1 =

QST_ID    QST_CODING    QST_CODING_RC_NAME
1         M79.68        diseaseX
2         A01.1         Intestinal diseases
3         K07           Diseases of oral cavity
4         Z09           diseaseY

最简单的解决方法是忽略之后的所有内容。并且基本上将'icd'视为icd *但是我没有让它在整个列表中工作。

我尝试使用match,pmatch和grep函数执行此操作,并尝试使用^(正则表达式wildcat)为所有icd加前缀,但它根本不起作用:

df1$QST_CODING_RC_name <- df2$name[pmatch(as.character(df1$QST_CODING), df2$icd, duplicates.ok = T)]

df1$QST_CODING_RC_name <- df2$name[grep(df2$icd, as.character(df1$QST_CODING), ignore.case = T)]

如果有人有解决方案,我会很高兴。非常感谢你的帮助。

编辑:QST_CODING包含不同形式的值(g.523等),其中点之后的信息是稍后需要处理的,不能简单地删除。此外,在QST_CODING中,点之前的部分以及之后的部分的长度不同。

r regex pattern-matching match matching
1个回答
0
投票

您可以尝试使用带有stringdist_joins的fuzzyjoin包。我使用了method = "soundex",但method = "qgram"在这个例子中给出了相同的结果。在完整数据集上,如果icd代码始终是QST_CODING字段的一部分,则使用qgrams可能会获得更好的结果,但这是您必须调查的内容。

library(fuzzyjoin)

stringdist_left_join(df, df, by = c("QST_CODING" = "icd"), method = "soundex")

  QST_ID QST_CODING  icd                    name
1      1     M79.68 <NA>                    <NA>
2      2      A01.1  A01     intestinal diseases
3      3        K07  K07 Diseases of oral cavity
4      4        Z09 <NA>                    <NA>
© www.soinside.com 2019 - 2024. All rights reserved.