这个问题在这里已有答案:
我的问题是我有一列数据(字符和数字组合),我想检查每个字段是否与不同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中,点之前的部分以及之后的部分的长度不同。
您可以尝试使用带有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>